Pacman yükseltmesinden sonra yeniden başlatmalı mıyım?


Yanıtlar:


10

Çekirdek, glibc veya systemd için güncellemeler varsa, güncellenmiş sürümlerin kullanımda olması için yeniden başlatmak isteyebilirsiniz. Masaüstü ortamınızda güncellemeleriniz varsa, basit bir oturum kapatma / oturum açma yeterlidir.


11

En iyi yol, hangi programların / hizmetlerin eski kütüphaneleri kullandığını bulmak ve yeniden başlatmaktır. Ve tüm kullanılmış dosyaları 'lsof' kullanarak listeleyerek ve 'DEL' tipinde olanları bularak başarabilirsiniz. DEL, dosya adının dosya sisteminden kaldırıldığı anlamına gelir, ancak birisi onu kullandığından hala bellekte kalır.

İşte tam komut satırı:

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

2
Bu hizmet ve kitaplık listesini oluşturduktan sonra, hangi systemd hizmetlerinin yeniden başlatılması gerektiği hala net değildir. Bu nedenle, hangi işlemlerin ve kitapçıkların yeniden başlatılması gerektiğini bilsem de, listeye göre hangi hizmetlerin yeniden başlatılacağını belirlemek genellikle önemsizdir.
bwv549

6

Yeniden başlatmanın tek zorunlu nedeni yeni bir çekirdeğidir (ve kexec'i kullanarak yeniden başlatabilirsiniz). Ayrıntılar için https://wiki.archlinux.org/index.php/Kexec adresine kısaca bakın:

  • yeni çekirdeği yükleyin, initramfs ve önyükleme cmdline'ını belirtin

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • çağırmak kexec ( systemctldüzgün kapatma için kullanın , kexec -edoğrudan yürütür)

    systemctl kexec
    
  • kexec-load@.serviceWiki'de açıklandığı gibi bir oluşturursanız , yeniden başlatırsanız, bir bios yeniden başlatma yapmak yerine systemdkullanarak otomatik olarak yeniden kexecbaşlatılacağını unutmayın.

Systemd hizmet adları veren biraz geliştirilmiş sürüm:

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

veya tek satırlık:

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

Bazı sorunlar olduğunu unutmayın:

  • systemctl daemon-reload başka bir şey yeniden başlatılmadan önce yürütülmelidir
  • PID 1'in ( systemdkendisi) yeniden başlatılması gerekiyorsa,systemctl daemon-reexec
  • systemctl restart dbus.service diğer bazı hizmetleri bozarsa, dbus yeniden başlatıldıktan sonra yeniden başlatılması gerekir:
    • systemd kendisi: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • muhtemelen diğer systemd - * / (yoğun olarak) kullanan diğer hizmetler dbus
  • SSH ile bağlıysanız ve SSH'nin yeniden başlatılması gerekiyor, ancak systemctl restart sshd bağlı olduğunuz sürece yeniden başlatmazsanız, 2 seçenek görüyorum:
    • zamanlama systemctl restart sshdkullanarakat/cron/systemd zamanlama
    • SSHgibi başka bir uzak (güvenli) kabuk kullanarak yeniden başlatmosh
  • çalıştırmak screen/tmux, aşağıdaki gibi hizmetleri de engelleyebilirSSH yeniden başlatılmasını , en kolay yol hizmetleri yeniden başlatmadan önce bu oturumları kapatmaktır
  • daha önceki bir cevapta belirtildiği gibi, özellikle grafik oturumlar için çıkış / giriş gerekebilir

1
kexec'in nasıl kullanıldığını açıklayan cevabı geliştirmek ister misiniz?
Rui F Ribeiro

0

Kolay bir yol, çalışan çekirdeğin sürümünü diskteki en son çekirdeğe kıyasla karşılaştırmaktır. Bir senaryo buldum kolayca yapabilen .

Birkaç çekirdek yüklü olduğundan, yalnızca çalışan çekirdeğe karşılık gelen komut dosyasını denetlemek için komut dosyasını değiştirdim. Örneğin, şu anda yüklü 4.9.79 ve 4.14.16 sürümlerim var ve bu nedenle /boot/vmlinuz-4.14-x86_64'ü kontrol etmem gerekiyor. Ne yazık ki bu, 5.1 sürümünü kullanmaya başladığımda işe yaramayacak, bu yüzden bir güncelleme gerekli (4'e 3 değiştirin) veya daha sağlam bir yol bulmam gerekiyor.

İşte benim senaryom:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.