5

Is there an equivalent to Debian/Ubuntu's /var/run/reboot-required for Arch Linux to determine if a system restart is required?

I'm looking for a comprehensive solution that also accounts for when critical libraries and the kernel are updated and a reboot is required to complete the upgrade. This is my current workaround which only accounts for the kernel:

if [[ $(pacman -Q linux | cut -d " " -f 2) > $(uname -r) ]]; then
  # reboot...
fi
4
  • Not an answer because I don’t know if it works on Arch, but I use the package “needrestart” - github.com/liske/needrestart – Darren Jan 24 at 6:46
  • Arch Linux users know by heart when they need to reboot. :) After experiencing a few breaking dependencies after system upgrade, I always restart whatever running process that got upgraded. Basically reboot every time you upgrade your system. – Qian Jan 24 at 9:42
  • @muru Tough call, the question is different, but some of the answers are relevant. – brettinternet Jan 24 at 20:17
  • Have you looked to see how Debian does it? – Michael Hampton Jan 25 at 2:18
2

I use this script to check if the boot kernel matches the current kernel and if a process is using any old libraries.

#!/bin/bash

get_boot_kernel() {
    local get_version=0
    for field in $(file /boot/vmlinuz*); do
        if [[ $get_version -eq 1 ]]; then
            echo $field
            return
        elif [[ $field == version ]]; then
            # the next field contains the version
            get_version=1
        fi
    done
}

rc=1

libs=$(lsof -n +c 0 2> /dev/null | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u)
if [[ -n $libs ]]; then
    cat <<< $libs
    echo "# LIBS: reboot required"
    rc=0
fi

active_kernel=$(uname -r)
current_kernel=$(get_boot_kernel)
if [[ $active_kernel != $current_kernel ]]; then
    echo "$active_kernel < $current_kernel"
    echo "# KERNEL: reboot required"
    rc=0
fi
exit $rc

Sample output:

Xorg: /usr/lib/libedit.so.0.0.63
Xorg: /usr/lib/libgssapi_krb5.so.2.2
Xorg: /usr/lib/libk5crypto.so.3.1
Xorg: /usr/lib/libkrb5.so.3.3
Xorg: /usr/lib/libkrb5support.so.0.1
Xorg: /usr/lib/libzstd.so.1.4.5
# LIBS: reboot required
5.10.8-arch1-1 < 5.10.10-arch1-1
# KERNEL: reboot required

If you only have processes using old libraries you can restart the processes instead of rebooting.

2
#!/usr/bin/bash

s1=$(pacman -Q linux | sed 's/linux //')
s2=$(uname -r | sed 's/-ARCH//')

if [ "$s1" == "$s2" ]; then
  echo OK
else
  echo REBOOT
fi

Seems to work. Source: bbs.archlinux.org/viewtopic.php?id=173508

3
  • 3
    This gives me a false positive (running inside a VM, updated a couple of days ago and rebooted right after the update). I think this happens because you check the latest kernel version available from upstream but do not check whether the update actually happened (run by the user). – ddnomad Jan 23 at 23:45
  • 1
    Thanks for sharing your answer. The thread you've cited is already linked in my question and it's essentially the same as my current workaround. I'm wondering, are there other scenarios or packages that aren't considered by this solution? Is it comprehensive when determining whether upgrades are pending a reboot? – brettinternet Jan 24 at 0:32
  • Didn't realize it was the same link. My bad. Apart from pacman or yay I don't think any other tool could determine when an upgrade is required. Reboot is required when configuration from files where "used" on boot, or programs loaded into RAM. I guess only pacman knows when these files changed. – Santiago Echevarria Jan 24 at 0:41
1

I've been using arch for years and am not aware of an equivalent. I don't use it on any production systems, so I usually wait until I get an error about a missing library to reboot. Then I also run into situations such as when KDE/QT updates, which makes all my graphical applications start to have weird errors, but the OS itself doesnt need a reboot, I just need to restart my WM/DE.

Not the answer you're looking for? Browse other questions tagged or ask your own question.