팩맨 업그레이드 후 다시 시작해야합니까?


답변:


10

커널, glibc 또는 systemd에 대한 업데이트가있는 경우 업데이트 된 버전이 사용되도록 다시 시작해야 할 수 있습니다. 데스크톱 환경을 업데이트 한 경우 간단한 로그 아웃 / 로그인으로 충분합니다.


11

가장 좋은 방법은 이전 라이브러리를 사용하는 프로그램 / 서비스를 찾아 다시 시작하는 것입니다. 'lsof'를 사용하여 사용 된 모든 파일을 나열하고 'DEL'유형의 파일을 찾아서이를 달성 할 수 있습니다. DEL은 파일 시스템에서 파일 이름이 제거되었지만 누군가 사용하기 때문에 여전히 메모리에 갇혀 있음을 의미합니다.

전체 명령 행은 다음과 같습니다.

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

2
해당 서비스 및 라이브러리 목록을 생성 한 후에도 어떤 시스템 서비스를 다시 시작해야하는지 명확하지 않습니다. 따라서 어떤 프로세스와 라이브러리를 다시 시작해야하는지 알고 있지만 일반적으로 해당 목록을 기반으로 다시 시작할 서비스를 결정하는 것은 쉽지 않습니다.
bwv549

6

재부팅해야하는 유일한 필수 이유는 새 커널입니다 (kexec를 사용하여 소프트 재부팅 할 수 있음). 자세한 내용은 https://wiki.archlinux.org/index.php/Kexec 를 참조 하십시오 .

  • 새로운 커널 initramfs를로드하고 부팅 cmdline을 지정하십시오

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • 호출 kexec( systemctl적절한 종료에 사용, kexec -e직접 실행)

    systemctl kexec
    
  • kexec-load@.service위키에 설명 된대로 a를 생성 하면 재부팅 하면 BIOS 재부팅 대신 systemd자동으로 소프트 kexec재부팅됩니다.

시스템화 된 서비스 이름을 제공하는 약간 개선 된 버전 :

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

또는 한 줄 :

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 다른 것을 다시 시작하기 전에 실행해야합니다
  • PID 1 ( systemd자체)을 다시 시작해야하는 경우 다음을 사용하여 수행 할 수 있습니다.systemctl daemon-reexec
  • systemctl restart dbus.service 다른 서비스를 중단하려면 dbus를 다시 시작한 후 다시 시작해야합니다.
    • systemd 그 자체: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • 아마도 많이 사용하는 다른 systemd-* / other 서비스 dbus
  • SSH를 통해 연결되어 있고 SSH를 다시 ​​시작해야하지만 systemctl restart sshd연결되어있는 동안 다시 시작하지 않으면 두 가지 옵션이 있습니다.
    • 타이머를 systemctl restart sshd사용하여 일정at/cron/systemd
    • 다음 SSH과 같은 다른 원격 (보안) 셸을 사용하여 다시 시작mosh
  • 실행하면 screen/tmux서비스 SSH재시작 과 같은 서비스도 차단 될 수 있습니다 . 가장 쉬운 방법은 서비스를 재시작하기 전에 이러한 세션을 닫는 것입니다
  • 이전 답변에서 언급했듯이, 특히 그래픽 세션의 경우 로그 아웃 / 로그인이 필요할 수 있습니다.

1
kexec 사용 방법을 설명하는 답변을 개선 하시겠습니까?
Rui F Ribeiro 10

0

쉬운 방법은 실행중인 커널의 버전을 디스크의 최신 커널과 비교하는 것입니다. 쉽게 할 수 있는 스크립트 를 찾았습니다 .

커널이 여러 개 설치되어 있으므로 실행중인 커널에 해당하는 커널 만 확인하도록 스크립트를 수정했습니다. 예를 들어, 현재 버전 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.