pacmanのアップグレード後に再起動する必要がありますか?


回答:


10

カーネル、glibc、またはsystemdに更新がある場合は、更新されたバージョンが使用されているように再起動することができます。たとえば、デスクトップ環境の更新がある場合は、簡単なログアウト/ログインで十分です。


11

最善の方法は、古いライブラリを使用しているプログラム/サービスを見つけて再起動することです。また、「lsof」を使用してすべての使用済みファイルをリストし、「DEL」タイプのファイルを見つけることで、これを実現できます。DELは、ファイル名がファイルシステムから削除されたことを意味しますが、誰かが使用しているため、メモリ内に残っています。

完全なコマンドラインを次に示します。

 sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u

2
サービスとライブラリのリストを生成した後、どのsystemdサービスを再起動する必要があるかはまだ明確ではありません。したがって、どのプロセスとライブラリを再起動する必要があるかはわかっていますが、通常はそのリストに基づいて再起動するサービスを決定するのは簡単ではありません。
bwv549

6

再起動する唯一の必須の理由は、新しいカーネルです(kexecを使用してソフト再起動できます)。要するに、詳細についてはhttps://wiki.archlinux.org/index.php/Kexecご覧ください

  • 新しいカーネルinitramfsをロードし、ブートコマンドラインを指定します

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • 呼び出しkexecsystemctl適切なシャットダウンに使用し、kexec -e直接実行します)

    systemctl kexec
    
  • kexec-load@.servicewikiで説明されているようにを作成した場合、再起動systemdするとkexec、BIOSを再起動する代わりに自動的にソフト再起動します。

systemdサービス名を提供する少し改良されたバージョン:

PIDS="(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u)"
for PID in $PIDS; do
    systemctl status $i
done | grep '●' | awk '{print $2}' | sort -u

または1行:

for i in $(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u); do systemctl status $i; done | grep '●' | awk '{print $2}' | sort -u

いくつかの問題があることに注意してください。

  • systemctl daemon-reload 他のものを再起動する前に実行する必要があります
  • PID 1(systemd自体)を再起動する必要がある場合は、次を使用して実行できます。systemctl daemon-reexec
  • systemctl restart dbus.service 他のいくつかのサービスを中断するため、dbus restartの後に再起動する必要があります。
    • systemd 自体: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • おそらく(頻繁に)使用する他のsystemd-* /その他のサービス dbus
  • SSHで接続していて、SSHをsystemctl restart sshd再起動する必要があるが、接続している限り再起動しない場合、2つのオプションが表示されます。
    • タイマーsystemctl restart sshdを使用したスケジュールat/cron/systemd
    • 次のSSHような別のリモート(セキュア)シェルを使用して再起動しますmosh
  • 実行screen/tmuxすると、サービスのSSH再起動がブロックされる場合があります。最も簡単な方法は、サービスを再起動する前にこれらのセッションを閉じることです
  • 前の回答で述べたように、特にグラフィカルセッションの場合、ログアウト/ログインが必要になる場合があります

1
kexecの使用方法を説明する回答を改善してもよろしいですか?
ルイFリベイロ

0

簡単な方法は、実行中のカーネルのバージョンをディスク上の最新のカーネルと比較することです。簡単にできるスクリプトを見つけました。

いくつかのカーネルがインストールされているため、実行中のカーネルに対応するもののみをチェックするようにスクリプトを変更しました。たとえば、現在バージョン4.9.79および4.14.16がインストールされているため、/ boot / vmlinuz-4.14-x86_64を確認する必要があります。残念ながら、これはバージョン5.1の使用を開始すると機能しなくなるため、更新が必要になる(4 x 3に置き換える)か、より堅牢な方法を見つける必要があります。

これが私のスクリプトです:

#!/bin/sh
NEXTLINE=0
FIND=""
CURRENT_KERNEL=`uname -r`
KERNEL_PATH="/boot/vmlinuz-${CURRENT_KERNEL:0:4}"
for I in `file $KERNEL_PATH*`; do
  if [ ${NEXTLINE} -eq 1 ]; then
    FIND="${I}"
    NEXTLINE=0
   else
    if [ "${I}" = "version" ]; then NEXTLINE=1; fi
  fi
done
    if [ ! "${FIND}" = "" ]; then
      if [ ! "${CURRENT_KERNEL}" = "${FIND}" ]; then
    echo "Boot required"
  else echo "No boot required"
  fi
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.