Kurze Antwort

Kurze Antwort

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/schedulednichts angezeigt (Datei existiert nicht). Nach dem manuellen Ausführen des Skripts (immer noch als Root) wird jedoch cat /run/systemd/shutdown/scheduledangezeigt, 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 -ewie 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-requiredvorhanden. 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 -fdass 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 foundIch habe es shutdowndurch ersetzt /usr/sbin/shutdownund 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

verwandte Informationen