Haruskah saya memulai kembali setelah upgrade pacman?


Jawaban:


10

Jika ada pembaruan untuk kernel, glibc atau systemd, Anda mungkin ingin memulai kembali sehingga versi yang diperbarui sedang digunakan. Jika Anda memiliki, katakanlah, pembaruan untuk lingkungan desktop Anda, logout / login sederhana sudah cukup.


11

Cara terbaik adalah menemukan program / layanan apa yang menggunakan pustaka lama dan memulai kembali. Dan Anda dapat mencapainya dengan mendaftar semua file yang digunakan menggunakan 'lsof' dan menemukan mereka yang memiliki tipe 'DEL'. DEL berarti nama file telah dihapus dari sistem file tetapi masih terjebak dalam memori karena seseorang menggunakannya.

Inilah baris perintah lengkap:

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

2
Setelah membuat daftar layanan dan pustaka, masih belum jelas layanan systemd mana yang perlu di-restart. Oleh karena itu, meskipun saya tahu proses dan lib mana yang perlu direstart, biasanya tidak sepele untuk menentukan layanan mana yang harus direstart berdasarkan daftar itu.
bwv549

6

Satu-satunya alasan wajib untuk reboot adalah kernel baru (dan Anda dapat melakukan soft-reboot menggunakan kexec). Lihat https://wiki.archlinux.org/index.php/Kexec untuk detailnya, singkatnya:

  • memuat kernel baru, initramfs dan tentukan cmdline boot

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • invoke kexec(gunakan systemctluntuk shutdown yang tepat, kexec -eakan dieksekusi langsung)

    systemctl kexec
    
  • Perhatikan bahwa jika Anda membuat kexec-load@.serviceseperti yang dijelaskan dalam wiki, jika Anda reboot, systemdakan secara otomatis soft-reboot menggunakan kexecdaripada melakukan reboot BIOS

Versi sedikit ditingkatkan yang memberikan nama layanan 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

atau satu baris:

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

Perhatikan bahwa ada beberapa masalah:

  • systemctl daemon-reload harus dieksekusi sebelum memulai kembali yang lain
  • jika PID 1 ( systemdsendiri) perlu di-restart, itu bisa dilakukan menggunakansystemctl daemon-reexec
  • systemctl restart dbus.service istirahat beberapa layanan lain, mereka harus di-restart setelah dbus restart:
    • systemd diri: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • mungkin systemd lain - * / layanan lain yang (banyak) digunakan dbus
  • Jika Anda terhubung melalui SSH dan SSH perlu dihidupkan ulang, tetapi systemctl restart sshdtidak akan memulai kembali selama Anda terhubung, saya melihat 2 opsi:
    • jadwal systemctl restart sshdmenggunakan at/cron/systemdtimer
    • restart SSHmenggunakan shell remote (aman) lain sepertimosh
  • menjalankan screen/tmuxjuga dapat memblokir layanan seperti SSHdari memulai kembali, cara termudah adalah dengan menutup sesi ini sebelum memulai kembali layanan
  • seperti yang diceritakan dalam jawaban sebelumnya, logout / login mungkin diperlukan, terutama untuk sesi grafis

1
maukah Anda memperbaiki jawaban yang menjelaskan bagaimana kexec digunakan?
Rui F Ribeiro

0

Cara yang mudah adalah membandingkan versi kernel yang berjalan dengan kernel terbaru pada disk. Saya menemukan skrip yang dapat melakukannya dengan mudah.

Karena saya memiliki beberapa kernel yang diinstal, saya memodifikasi skrip untuk memeriksa hanya satu yang sesuai dengan kernel yang sedang berjalan. Sebagai contoh, saat ini saya memiliki versi 4.9.79 dan 4.14.16 yang diinstal dan karenanya perlu memeriksa / boot / vmlinuz-4.14-x86_64. Sayangnya ini tidak akan berfungsi ketika saya mulai menggunakan versi 5.1, jadi pembaruan akan diperlukan (ganti 4 dengan 3) atau saya perlu menemukan cara yang lebih kuat.

Ini skrip saya:

#!/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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.