回答:
最善の方法は、古いライブラリを使用しているプログラム/サービスを見つけて再起動することです。また、「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
kexec-load@.service
wikiで説明されているようにを作成した場合、再起動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
他のものを再起動する前に実行する必要がありますsystemd
自体)を再起動する必要がある場合は、次を使用して実行できます。systemctl daemon-reexec
systemctl restart dbus.service
他のいくつかのサービスを中断するため、dbus restartの後に再起動する必要があります。
systemd
自体: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
再起動する必要があるが、接続している限り再起動しない場合、2つのオプションが表示されます。
systemctl restart sshd
を使用したスケジュールat/cron/systemd
SSH
ような別のリモート(セキュア)シェルを使用して再起動しますmosh
screen/tmux
すると、サービスのSSH
再起動がブロックされる場合があります。最も簡単な方法は、サービスを再起動する前にこれらのセッションを閉じることです簡単な方法は、実行中のカーネルのバージョンをディスク上の最新のカーネルと比較することです。簡単にできるスクリプトを見つけました。
いくつかのカーネルがインストールされているため、実行中のカーネルに対応するもののみをチェックするようにスクリプトを変更しました。たとえば、現在バージョン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