Haruskah saya memulai kembali setelah upgrade pacman?

17

setelah berlari

sudo pacman -Syyu

atau

sudo pacman -S [something to install]

haruskah saya memulai kembali hanya agar aman?

ahtmatrix
sumber

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.

schaiba
sumber
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
pengguna576557
sumber
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 [email protected]seperti 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
Michel Ganguin
sumber
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
Aurelien
sumber