El script no se ejecuta a través de crontab pero funciona bien de forma independiente

51

Tengo una secuencia de comandos que me recuerda reiniciar mi computadora si uptimees más de 3 días (aunque ahora está configurada en 0 días solo para verificar si la secuencia de comandos se está ejecutando ya que mi computadora ha estado activa solo durante un día ...).

¡Me doy cuenta de que no es el guión más elegante, pero lo estoy intentando! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Lo hice ejecutable chmod + x checkup.shy funciona bien cuando lo ejecuto desde el terminal a través de./checkup.sh

Mi entrada crontab para este script es:

46 14 * * * /home/username/Desktop/./checkup.sh

Entonces funciona a las 14: 46hrs diariamente ...

Entonces ... estoy pensando que debería funcionar, a menos que no haya hecho algo realmente tonto. Además, ¿crees que está bien mover este script bash /bin?

querida N
fuente
1
Lo pondría en / opt / bin o ~ / bin como una práctica recomendada general para no acumular datos donde los paquetes piensan que están las cosas.
RobotHumans
Si ejecuta el script de esta manera: /home/dnaneet/Desktop/./checkup.sh ¿funciona? Pondría /home/dnaneet/Desktop/checkup.sh
LnxSlck 01 de
@LnxSlck Sí, la ejecución /home/dnaneet/Desktop/./checkup.shfunciona bien. Pero /home/dnaneet/Desktop/checkup.shpuede no funcionar bien? Porque necesita un ./?
dearN
1
No creo que cron sepa nada de tu sesión X.
Glenn Jackman
@glennjackman Entonces, ¿qué significa eso? ¿Significa que ejecutar tal script a través de crontab no permite que aparezca un mensaje emergente en el entorno gnome?
dearN

Respuestas:

71

Una cosa a la vez:

Primero, démosle una carpeta bin basada en el usuario:

cd ~/ && mkdir bin

Desea usar crontab. Comencemos con algo realmente simple:

* * * * * touch /tmp/testing.txt

Ok, entonces eso funciona

Ahora intentemos ejecutar un script que haga lo mismo

* * * * * /home/username/bin/touchtest.sh

ejecutar una vez por minuto hasta que funcione
No, no necesita un ./ en el medio de la línea. ./ es para cuando estás dando URL relativas.
Ok, entonces eso funciona

Ahora intentemos ejecutar un script que llame a xmessage

* * * * * /home/username/bin/rebootwarn.sh

no funciona

Primero, no debemos depender de las variables de entorno. Esto incluye la configuración de ruta, la configuración x11 o cualquier otra cosa (me vienen a la mente las variables de entorno python y ruby ​​...)

Hagamos que el nuestro se parezca un poco al archivo cron adecuado de anacron ... Lo guardé como prueba

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Configurado para ejecutarse una vez por minuto

crontab test para importarlo

En el guión

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Bien, eso funciona ... ¿qué hicimos?
Cambiamos todos los comandos para no depender de rutas que no establecimos explícitamente
. Ejecutamos nuestro script explícitamente con bash.
Le dijimos al script que esperamos estar en DISPLAY: 0.0

RobotHumanos
fuente
Gracias por la respuesta. Dijiste "Hagamos que el nuestro se parezca un poco al archivo cron apropiado de anacron ... Lo guardé como prueba" ... ¿NUESTRO qué? El archivo crontab? :-/
dearN
Aquí está lo que observé. Primero tuve que deshacerme del espacio antes y después =para la línea que especifica DISPLAY. En segundo lugar, cuando edité mi archivo crontab y agregué el PATHque se sugirió y configuré el tiempo para ejecutarse en otro momento, la ventana emergente no se mostró. Sin embargo, la ventana emergente se mostró bien al ejecutar el script usando /bin/bash... ¿qué da?
dearN
¿Qué sabes? Una vez que cambié mi guión export DISPLAY=:0.0, funcionó bien. Aunque hubo un tiempo significativo de aproximadamente 5 segundos después de que el reloj marcara la hora en que mi ventana emergente debería haber mostrado ... ¿Alguna sugerencia? Pero sí, ¡enmiendas al trabajo de guión!
dearN
No tengo idea del retraso de 5 segundos.
RobotHumans
3
Me encanta la forma en que pasaste este paso a paso y luego lo resumiste, ¡gracias!
jbobbins
10

El problema se resolvió, lea el manual en Google:

descripción:

  1. Tengo script usando #!/bin/bashcomo encabezado
  2. Puse el guión en /home/wc3/palert/

análisis:

  1. crontab no puede ejecutar mi script
  2. Pero si ejecuto manualmente, muestra el resultado y también puedo ver el resultado en mi web
  3. Significa que crontab no puede obtener el entorno como cuando ejecuta su script en su carpeta de script

responder:

  1. ponga su entorno usando esta línea a continuación en su script con:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    cambie esto: /home/wc3/palert
    con: el lugar donde coloca su script, por ejemplo/home/budi/script.sh

muestra:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Intenta poner tu script en crontab.

budi satriyo
fuente
no funciona para mí
John Joe
¡Trabaja como un encanto para mí!
1rq3fea324wre