csuhas32 Nem tudok ellenállni a csábításnak, hogy ezen a labdán ne pattintsak egyet.
Én mindenhol a systemback.sh -t használom. Amikor kétes kimenetelű hebrákolásba kezdek, előtte készítek rendszervisszaállítási pontot. Ez érvényes a headless gépekre, VPS-re is.
Ha valami balul üt ki, visszatérek a kiinduló állapothoz.
Más kategória a GUI gépek, amik laptopok, desktopok mezei felhasználók kezében.
A "mezei" itt annyit jelent, hogy csak használja, tudja használni, de ha hiba van, nem tud vele mit kezdeni.
Megfigyeltem, hogy az alapértelmezett "kézi" frissítési metódus nem működik náluk, mert nem tudnak vagy akarnak vele foglalkozni. Ezért összelegóztam egy szkriptet, amit egy timer minden nap egyszer lefuttat.
Ez gondoskodik a frissítésekről, a bejelentkezett felhasználót értesíti, ha van teendője, arra is emlékeztet, de ennél erőszakosabbat nem tesz.
#!/bin/bash
notify_users()
{
typeset title="$1"
typeset message="$2"
who | grep "(:" | while IFS=" " read -r name tty date ltime cons
do
uid=$(id -u $name)
sudo -u $name env XDG_RUNTIME_DIR=/run/user/$(id -u $name) notify-send -a Updater -i dialog-warning "$title" "$message"
done
}
notifyneedrestart()
{
who | grep "(:" | while IFS=" " read -r name tty date ltime cons
do
uid=$(id -u $name)
kernelupd=$(grep "Running kernel seems to be up-to-date" < /tmp/nr.txt)
deferred=$(grep "Service restarts being deferred" < /tmp/nr.txt )
oldrunning=$(grep "$name.*user manager" < /tmp/nr.txt | sed 's/.*: //')
oldrunning2=$(grep "$name.*session" < /tmp/nr.txt | sed 's/.*: //')
message=""
title="Updater"
if [ -n "$oldrunning" ] || [ -n "$oldrunning2" ]; then
title="Ki- / bejelentkezés szükséges lehet!"
message="<b>A munkamenetedben bizonyos frissített programok régebbi példánya(i) futnak:</b>\nUser manager: $oldrunning\nSession: $oldrunning2\n<i>Kérlek, ha tudsz, gondoskodj a folyamatok újraindításáról, esetleg fontold meg a ki- és bejelentkezést egy erre kényelmes időben, hogy azok a folyamatok is újraindulhassanak, amik a munkameneted lezárása nélkül nem tudnak!</i>\nA rendszer teljes újraindítása is megfelelő, de nem szükséges."
fi
if [ -n "$deferred" ]; then
title="Újraindítás szükséges!"
message="<b>Néhány rendszerszolgáltatás programja frissítve lett, és most a régebbi példánya(i) fut(nak).</b>\nHogy a frissebb változatok működjenek, a teljes rendszert újra kell indítani!\n<i>Kérlek, fontold meg a rendszer újraindítását egy erre kényelmes időben!</i>"
fi
if [ ! -n "$kernelupd" ]; then
title="Újraindítás szükséges!"
message="<b>Újabb kernel került a rendszerre, a használatbavételéhez a teljes rendszert újra kell indítani!</b>\n<i>Kérlek, fontold meg a rendszer újraindítását egy erre kényelmes időben!</i>"
fi
if [ -n "$message" ]; then
sudo -u $name env XDG_RUNTIME_DIR=/run/user/$(id -u $name) notify-send -a Updater -i dialog-warning -t 14000 --urgency=critical "$title" "$message"
fi
done
}
echo "Updater script started" | logger
if [ ! -f "/tmp/updating" ]; then
touch /tmp/updating
cnt=0
while [ $cnt -lt 5 ]
do
status=$(ping -c 1 -q debian.org >&/dev/null; echo $?)
if [ ! "$status" == "0" ];
then
echo "No internet for updating, retry in 20 sec." | logger
sleep 20
((cnt++))
else
cnt=6
fi
done
if [ "$status" == "0" ];
then
apt update
updates=$(apt list --upgradeable |& grep -Ev '^(Felsorolás|Listing|WARNING)')
echo $updates
if [ -n "$updates" ]; then
apt clean
notify_users "Rendszerfrissítés" "Frissítés elindult (visszaállítási pont készül...)"
echo "Systemback snapshot" | logger
/opt/systemback.sh -n
echo "Doing update:" | logger
notify_users "Rendszerfrissítés" "A visszaállítási pont elkészült, a tényleges frissítés most indul...)"
apt-get upgrade -y | logger
echo "apt-get upgrade exit code: " $? | logger
apt-get autoremove --purge -y
echo "apt-get autoremove exit code: " $? | logger
notify_users "Rendszerfrissítés" "Frissítés készen van."
fi
fi
needrestart -r a -u NeedRestart::UI::stdio >/tmp/nr.txt
cat /tmp/nr.txt | logger
notifyneedrestart
rm /tmp/nr.txt
rm /tmp/updating
fi
echo "Updater script finished" | logger
Kell hozzá a needrestart, notify, systemback. A needrestart jól meg tudja tippelni, kell-e valamit újraindítani, a notify-send pedig értesítéseket tud generálni, ami hasznos a felhasználó tájékoztatásához.
A systemback pedig a tényleges frissítés előtt csinál egy visszaállítási pontot, hogy legyen mihez nyúlni, ha esetleg...
De még emiatt sosem kellett.
A napi futtatásáról a systemd gondoskodik, a .service unit:
/etc/systemd/system/updater.service
[Unit]
Description=updater service
[Service]
Type=simple
ExecStart=/opt/updater.sh
[Install]
WantedBy=multi-user.target
Ezt triggereli a hozzávaló timer:
/etc/systemd/system/updater.service
[Unit]
Description=updater service
[Service]
Type=simple
ExecStart=/opt/updater.sh
[Install]
WantedBy=multi-user.target
root@DellG3:/home/laco# cat /etc/systemd/system/updater.timer
[Unit]
Description=Execute task every day
[Timer]
OnCalendar=*-*-* 19:10:00
RandomizedDelaySec=5m
Persistent=true
Unit=updater.service
[Install]
WantedBy=timers.target
Ennyi.
Ja, igen. A "gyári" frissítés kezelő/ellenőrző izé-bizék le vannak puculva.