¿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?


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.


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.


¿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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.