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/scheduled
no muestra nada (el archivo no existe). Sin embargo, después de ejecutar el script manualmente (aún como root), cat /run/systemd/shutdown/scheduled
se 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 -e
como 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-required
existe. 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 -f
que 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 found
reemplacé y funcionó!shutdown
/usr/sbin/shutdown
Las líneas con el prefijo +
se generan mediante set -x
las cuales configuré para la depuración.
Editar: Ver tambiénhttps://askubuntu.com/a/13733/40581