走った後
Sudo pacman -Syyu
または
Sudo pacman -S [something to install]
安全のために再起動する必要がありますか?
カーネル、glibc、またはsystemdに更新がある場合は、更新されたバージョンが使用されるように再起動することができます。たとえば、デスクトップ環境を更新する場合は、単純なログアウト/ログインで十分です。
最良の方法は、古いライブラリを使用しているプログラム/サービスを見つけて再起動することです。また、「lsof」を使用してすべての使用済みファイルをリストし、「DEL」タイプのファイルを見つけることで、これを実現できます。 DELは、ファイル名がファイルシステムから削除されたが、誰かがそれを使用しているためにメモリに残っていることを意味します。
ここに完全なコマンドラインがあります:
Sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
再起動する唯一の必須の理由は新しいカーネルです(そしてkexecを使用してソフト再起動できます)。詳細については https://wiki.archlinux.org/index.php/Kexec を参照してください:
新しいカーネルinitramfsをロードし、ブートコマンドラインを指定します
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
kexec
を呼び出します(適切なシャットダウンにはsystemctl
を使用します。kexec -e
は直接実行されます)
systemctl kexec
Wikiで説明されているように[email protected]
を作成した場合、再起動すると、systemd
はBIOSの再起動ではなく、kexec
を使用して自動的にソフト再起動します。
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
は、他のものを再起動する前に実行する必要がありますsystemd
自体)を再起動する必要がある場合は、systemctl daemon-reexec
を使用して再起動できますsystemctl restart dbus.service
は他の一部のサービスを壊します。dbusrestart:の後で再起動する必要があります。systemd
自体:systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
を(頻繁に)使用する他のサービスsystemctl restart sshd
は再起動しない場合、2つのオプションが表示されます。systemctl restart sshd
タイマーを使用してat/cron/systemd
をスケジュールするSSH
などの別のリモート(セキュア)シェルを使用してmosh
を再起動しますscreen/tmux
を実行すると、SSH
などのサービスの再起動がブロックされることもあります。最も簡単な方法は、サービスを再起動する前にこれらのセッションを閉じることです簡単な方法は、実行中のカーネルのバージョンをディスク上の最新のカーネルと比較することです。簡単にできる script を見つけました。
複数のカーネルをインストールしているので、実行中のカーネルに対応するカーネルのみをチェックするようにスクリプトを変更しました。たとえば、現在バージョン4.9.79と4.14.16がインストールされているため、/ boot/vmlinuz-4.14-x86_64を確認する必要があります。残念ながら、バージョン5.1の使用を開始するとこれは機能しないため、更新が必要(4を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