¿Por qué no funciona un script en /etc/cron.hourly?

16

Puse un script ejecutable /etc/cron.hourly, pero ese script no se ejecutó cada hora, en realidad nunca se ejecuta.

Aquí está el guión (Hour-sound) que hice:

#! / bin / bash
mplayer ~ / Music / sfx_msg-highlight.wv &> / dev / null &
spd-say -r -50 -p 50 -t male3 "El tiempo ahora es $ (fecha +"% l% p ")"
notificar-enviar "Es:" "$ (fecha +"% l% p ") ahora". -i ~ / Imágenes / "first tee.png" -t 5000

Mi crontab es:

DISPLAY=":0.0"
XAUTHORITY="/home/naruto/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /home/naruto/Hour-sound.sh

Mientras que los comandos mplayery spd-sayse ejecutan correctamente, notify-sendno lo es. También intenté redirigir el error a un archivo:

0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error

Pero eso no mostró salida. ¿Qué estoy haciendo mal?

Bloque negro
fuente
solo asegurándome, ¿hiciste el script ejecutable? propiedad de root? ¿Qué sucede cuando ejecuta el script desde la terminal o coloca un script simple allí? ¿ /etc/crontabTiene la run-partslínea para ejecutar crontrabajos por hora desde el directorio?
heemayl
Ejecutable: sí, ejecutar el script va bien, nada está mal desde el directorio /etc/cron.hourly, no sé cómo verificar esto, ¿está en las aplicaciones de inicio? @heemayl
Black Block
1
¿El /etc/crontabarchivo tiene la línea 17 * * * * root cd / && run-parts --report /etc/cron.hourly?
heemayl
1
Por favor, no publicar capturas de pantalla de texto . Especialmente cuando ese texto se muestra en una ventana de terminal transparente e incluye colores que distraen.
terdon

Respuestas:

24

Como probablemente haya visto en los comentarios a su pregunta, los cronjobs en /etc/cron.hourly(y los otros directorios similares) son ejecutados por run-parts. run-partses un poco exigente con los nombres de archivos. Por defecto, no ejecuta archivos cuyos nombres de archivo contengan algo que no sea (todos los de ASCII)

  • letras mayúsculas
  • letras minusculas
  • dígitos
  • guiones bajos
  • guiones ("signos menos")

Entonces, si su script tiene un nombre de archivo de, por ejemplo, "myscript.sh", simplemente se ignora, porque run-partsno le gusta el punto.

Henning Kockerbeck
fuente
1- Aquí están mis archivos: mediafire.com/view/rg8r85xb7qw26zs/cron.hourly_017.png 2- ¿ Intentó algún script en /etc/cron.hourly y trabajó con usted?
Black Block
2
Acabo de probar un pequeño script que escribió "Hola" a un archivo en / tmp, y funcionó sin problemas. Por si acaso, ¿sabe que las secuencias de comandos /etc/cron.hourlyno se ejecutan necesariamente "a la hora"? Si su cronjob /etc/crontabtiene 17 en la posición de minutos, los scripts se ejecutan a las 00:17, 01:17 y así sucesivamente. ¿Y de nuevo por si acaso, los permisos del script permiten al usuario root ejecutarlos?
Henning Kockerbeck
Sí, pero ese script mío nunca se ejecuta en ningún momento. y sobre el permiso ver aquí: mediafire.com/view/psnb4bflawdlyly/…
Black Block
Tal vez en realidad es un problema de permiso. Sé que los scripts en general /etc/cron.d/no deben tener permisos de escritura o ejecución para "grupo" u "otros". "propietario" necesita permiso de ejecución, "grupo" y "otros" solo deben tener permiso de lectura. Tal vez eso también se aplica /etc/cron.hourly, aunque no lo probé.
Henning Kockerbeck
Ok, entonces he cambiado el permiso para mi archivo mediafire.com/view/s2lq63u7z54ohbo/… que hace que el grupo que es el grupo raíz sea de solo lectura y otros, entonces ¿esto va a causar algún problema?
Black Block
5

Un problema es que está intentando ejecutar una aplicación gráfica ( notify-send) desde cron. Eso requiere un pequeño ajuste. Debe configurar XAUTHORITYy DISPLAYvariables en el crontab para que pueda conectarse a su sesión X en ejecución y debe configurar XDG_RUNTIME_DIRpara que pueda conectarse a su sesión de pulseaudio. Desafortunadamente, estos deben configurarse en el crontab en sí mismo, por lo que no puede usarlos /etc/cron.hourly. En su lugar, ejecute crontab -ey agregue estas líneas:

DISPLAY=":0.0"
XAUTHORITY="/home/YOURUSERNAME/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /path/to/script.sh 

Cambie el valor de XDG_RUNTIME_DIRlo que sea que se devuelva cuando los echoenvíe desde un terminal. En mi sistema, esto es:

$ echo $XDG_RUNTIME_DIR
/run/user/1001

Probablemente será lo mismo en la suya, pero verifique primero. Ahora, su script se ejecutará cada hora y debería funcionar como se espera.

terdon
fuente
¿Es eso lo que quieres decir con mediafire.com/view/ucjpvu8b41n3hue/… . Esto no funcionó para mí.
Black Block
Creo que si el problema estaba en el envío de notificaciones, ¿por qué otro comando no se ejecutó también (como mplayer)?
Black Block
@BlackBlock hay múltiples problemas. i) notify-sendnecesita que se establezcan las variables XAUTHORITYy DISPLAY, y ii) mplayernecesita XDG_RUNTIME_DIRque se configuren. ¿Probaste mi sugerencia? Eso debería solucionar ambos problemas. Probablemente también tuvo problemas de nombres debido a run-partslo explicado en la otra respuesta.
terdon
Entonces, ¿por qué esto no funcionó para mí? voy a estar enojado! vea mi imagen en el primer comentario sobre su respuesta
Black Block
@BlackBlock no! Estás editando /etc/crontab, no hagas eso. Desea que esto se ejecute como su usuario, no como root, y ese archivo tiene un formato diferente de todos modos. Simplemente haga lo que dije en mi respuesta, corra crontab -ey agregue las líneas allí.
terdon
3

Un script que termina con .shno se ejecuta en la /etc/cron.hourlycarpeta:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911 Los
enlaces o binarios dentro de un directorio manejado por run-pars (como /etc/cron.daily) no se ejecutarán si un período es parte de su nombre.

renombrar el guión

mv /etc/cron.hourly/Hour-sound.sh /etc/cron.hourly/Hour-sound

o poner la secuencia de comandos en

/etc/crontab

que permite el .shfinal

rubo77
fuente
1

No use script con extensión (abc.sh) y agregue su lugar de necesidad. (horas cron.)

agregue su código al archivo abc y guárdelo. (para su necesidad) (este debería ser el comando bash)

utilizar

sudo chmod +x abc

comando para hacer un archivo ejecutable.

edit etc/cronrtab file

tiene unas pocas líneas predefinidas. edite de su línea de minutos a horas y guárdelo.

entonces se ejecutará correctamente.

Aruna D Mahagamage
fuente