Hintergrund
Ich versuche, ein Skript zu schreiben (siehe Ende der Frage), das die Temperatur auf Raspberry PI überprüft und es automatisch herunterfährt, wenn sie zu hoch wird. Das Skript würde einmal pro Minute von Cron ausgeführt werden.als root.
Das Problem
Das Skript wird ausgeführt, die Meldung wird wie erwartet ausgegeben, aber das Herunterfahren ist nicht geplant und es gibt keine Fehlermeldung mit den Gründen. Tatsächlich wird nach dem Ausführen des Skripts durch cron cat /run/systemd/shutdown/scheduled
nichts angezeigt (Datei existiert nicht). Nach dem manuellen Ausführen des Skripts (immer noch als Root) wird jedoch cat /run/systemd/shutdown/scheduled
angezeigt, dass das Herunterfahren tatsächlich geplant ist.
Frage
Warum funktioniert das Skript, wenn es manuell aufgerufen wird, aber nicht, wenn es per Cron aufgerufen wird (obwohl es sich in der Crontab von Root befindet)?
Verwandt
Diese Frageist ähnlich, aber die Schlussfolgerung der Antworten scheint zu sein, dass das Hinzufügen von Herunterfahren zuWurzelncrontab ( crontab -e
wie ich es tue) sollte in Ordnung sein.
Einzelheiten
Das Skript:/root/shutdown_overheat.sh
#!/bin/sh
MAXTEMP=30 # temporarily lowered for testing
TEMP=$(/opt/vc/bin/vcgencmd measure_temp | awk -F'[=.]' '{print $2}')
MSG="Temperature $TEMP higher than $MAXTEMP, shutting down in 2 minutes"
if [ "$TEMP" -gt "$MAXTEMP" ]; then
wall $MSG
logger System $MSG
shutdown -h +2 $MSG
fi
Manuelles Ausführen des Skripts (als Root):
# ./shutdown_overheat.sh
Broadcast message from attilio@kolcsag (pts/0) (Fri Mar 13 20:41:13 2020):
Temperature 54 higher than 30, shutting down in 2 minutes
Shutdown scheduled for Fri 2020-03-13 20:43:13 GMT, use 'shutdown -c' to cancel.
# cat /run/systemd/shutdown/scheduled
USEC=1584132193792504
WARN_WALL=1
MODE=poweroff
WALL_MESSAGE=Temperature 54 higher than 30, shutting down in 2 minutes
Von cron ausgeführtes Skript:
Broadcast message from root@kolcsag (somewhere) (Fri Mar 13 20:42:01 2020):
Temperature 54 higher than 30, shutting down in 2 minutes
# cat /run/systemd/shutdown/scheduled
cat: /run/systemd/shutdown/scheduled: No such file or directory
Roots Crontab:
# crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# ... etc
* * * * * /root/shutdown_overheat.sh
Antwort1
Kusalananda und Gogoud haben recht. Sie sollten überprüfenCron-Mail.
Kurze Antwort
Ersetzen:
if [ "$TEMP" -gt "$MAXTEMP" ]; then
wall $MSG
logger System $MSG
shutdown -h +2 $MSG
fi
mit:
if [ "$TEMP" -gt "$MAXTEMP" ]; then
wall $MSG
logger System $MSG
/usr/sbin/shutdown -h +2 $MSG
fi
Oder wo auch immer Ihre Binärdatei ist ( whereis -b shutdown
).
Lange Antwort
Ich habe versucht umzusetzencron-aptund Neustart, falls /var/run/reboot-required
vorhanden. Ich hatte alle meine erwarteten Protokollmeldungen in Journald, aber der Neustart funktionierte nicht. Hier ist, was ich in cron.d hatte, wo cron-apt seine Definitionen ablegt. Ich habe alles in ein benutzerdefiniertes Skript aufgeteilt, ähnlich wie Sie es getan haben. Die zweite Zeile war nur zum Testen.
$ sudo cat /etc/cron.d/cron-apt
45 3 * * * root "/usr/local/bin/cron-apt-server"
*/10 * * * * root "/usr/local/bin/cron-apt-server"
Bevor ich es alle 10 Minuten versuchte, habe ich cron.hourly ausprobiert:
$ sudo ln -sf /usr/local/bin/cron-apt-server /etc/cron.hourly/
Das hat funktioniert! Jetzt war ich noch verwirrter!
Ich habe die von meinem Skript überprüften Dateien neu erstellt:sudo touch /var/run/reboot-required{,.pkgs}; echo test | sudo tee -a /var/run/reboot-required.pkgs
Und ich habe cron.d noch einmal getestet. Dann fiel mir auf, journalctl -f
dass es mir direkt nach meinem Cron-Job eine E-Mail-Benachrichtigung schickte:
Mär 10 14:35:24 studentvm1 cron-apt-server[5260]: Rebooting for packages: test
Mär 10 14:35:24 studentvm1 CRON[3037]: pam_unix(cron:session): session closed for user root
Mär 10 14:35:24 studentvm1 postfix/pickup[1998]: A4346601AA6: uid=0 from=<root>
Mär 10 14:35:24 studentvm1 postfix/cleanup[5264]: A4346601AA6: message-id=<20210310133524.A4346601AA6@ubuntu-server>
Mär 10 14:35:24 studentvm1 postfix/qmgr[1999]: A4346601AA6: from=<root@ubuntu-server>, size=1444, nrcpt=1 (queue active)
Postfix oder Root haben mir gerade eine E-Mail geschickt.
$ sudo mail
Mail version 8.1.2 01/15/2001. Type ? for help.
"/var/mail/root": 21 messages 21 new
[...]
N 21 root@ubuntu-serve Wed Mar 10 14:30 38/1551 Cron <root@studentvm1> "/usr/local/bin/cron-apt-server"
Ups, wir haben 21 Nachrichten ignoriert. Öffnen wir die letzte.
& 21
Message 21:
From root@ubuntu-server Wed Mar 10 14:30:01 2021
X-Original-To: root
From: root@ubuntu-server (Cron Daemon)
To: root@ubuntu-server
Subject: Cron <root@studentvm1> "/usr/local/bin/cron-apt-server"
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
Date: Wed, 10 Mar 2021 14:30:01 +0100 (CET)
[...]
+ [[ -f /var/run/reboot-required ]]
+ [[ server == \s\e\r\v\e\r ]]
++ cat /var/run/reboot-required.pkgs
+ msg='Rebooting for packages: test'
+ logger_notice 'Rebooting for packages: test'
+ logger -p notice -t cron-apt-server 'Rebooting for packages: test'
+ shutdown -r now 'Rebooting for packages: test'
/usr/local/bin/cron-apt-server: line 66: shutdown: command not found
& q
Und da hatte ich es: line 66: shutdown: command not found
Ich habe es shutdown
durch ersetzt /usr/sbin/shutdown
und es hat funktioniert!
Es werden die Zeilen mit dem Präfix „mit“ +
generiert set -x
, die ich zum Debuggen festgelegt habe.
Bearbeiten: Siehe auchhttps://askubuntu.com/a/13733/40581