Respuesta corta

Respuesta corta

Fondo

Estoy intentando escribir un script (ver el final de la pregunta) que verifique la temperatura en Raspberry PI y la apague automáticamente si sube demasiado. El script se ejecutaría mediante cron, una vez por minuto,como raíz.

El problema

Se ejecuta el script, el mensaje se imprime como se esperaba, pero el apagado no está programado y no hay ningún mensaje de error que indique el motivo. De hecho, después de que cron ejecuta el script, cat /run/systemd/shutdown/scheduledno muestra nada (el archivo no existe). Sin embargo, después de ejecutar el script manualmente (aún como root), cat /run/systemd/shutdown/scheduledse muestra que el apagado está programado.

Pregunta

¿Por qué el script funciona cuando se invoca manualmente, pero no cuando se invoca mediante cron (aunque esté en el crontab de root)?

Relacionado

Esta preguntaes similar, pero la conclusión de las respuestas parece ser que agregar el apagado araícescrontab (a través de crontab -ecomo lo hago yo) debería estar bien.

Detalles

La secuencia de comandos:/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

Ejecutando el script manualmente (como 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

Script ejecutado por cron:


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

crontab de raíz:

# crontab -l



# Edit this file to introduce tasks to be run by cron.
# 
# ... etc

* * * * * /root/shutdown_overheat.sh

Respuesta1

Kusalananda y gogoud tienen razón. deberías comprobarcorreo cron.

Respuesta corta

Reemplazar:

if [ "$TEMP" -gt "$MAXTEMP" ]; then
        wall $MSG
        logger System $MSG
        shutdown -h +2 $MSG
fi

con:

if [ "$TEMP" -gt "$MAXTEMP" ]; then
        wall $MSG
        logger System $MSG
        /usr/sbin/shutdown -h +2 $MSG
fi

O dondequiera que esté su binario ( whereis -b shutdown).

Respuesta larga

Estaba tratando de implementarcron-aptoy reiniciar si /var/run/reboot-requiredexiste. Tenía todos los mensajes de registro esperados en el diario, pero reiniciar no funcionó. Esto es lo que tenía en cron.d donde cron-apt pone sus definiciones. Separé todo en un script personalizado, similar a lo que hiciste. La segunda línea era sólo para probar.

$ sudo cat /etc/cron.d/cron-apt
45 3 * * *  root  "/usr/local/bin/cron-apt-server"
*/10 * * * *  root  "/usr/local/bin/cron-apt-server"

Antes de intentarlo cada 10 minutos, probé cron.hourly:

$ sudo ln -sf /usr/local/bin/cron-apt-server /etc/cron.hourly/

¡Eso funciono! ¡Ahora estaba aún más confundido!

Recreé los archivos marcados por mi script:sudo touch /var/run/reboot-required{,.pkgs}; echo test | sudo tee -a /var/run/reboot-required.pkgs

Y probé cron.d nuevamente. Luego noté journalctl -fque me hablaba del correo justo después de mi trabajo cron:

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 me acaba de enviar un correo electrónico o root.

$ 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"

Vaya, ignoramos 21 mensajes. Abramos el último.

& 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

Y ahí lo tenía: ¡ lo line 66: shutdown: command not foundreemplacé y funcionó!shutdown/usr/sbin/shutdown

Las líneas con el prefijo +se generan mediante set -xlas cuales configuré para la depuración.

Editar: Ver tambiénhttps://askubuntu.com/a/13733/40581

información relacionada