Ejecutando .sh cada 5 minutos

12

Tengo un script .sh que descarga una foto del servidor del satélite japonés y la configura como imagen de fondo. Lo puse en la lista de inicio, pero ¿cómo lo ejecuto cada 5 minutos automáticamente?

Aleksander Mahnyov
fuente
1
Pruebe cronmaker.com, allí puede hacer expresiones cron y ponerlo con crontab -e
Somos Borg
2
¿La imagen cambia incluso cada 5 minutos? Intente usar un intervalo que cree una carga menos innecesaria en el servidor de destino. O asegúrese de descargar solo si el archivo realmente ha cambiado.
til_b
1
Por cierto, ¿cuál es la url para los fondos del espacio?
bohdan_trotsenko

Respuestas:

14

La opción perezosa

Si desea la manera fácil y evite tener que averiguar qué variable de entorno establecer:

  • Asegúrese de que su secuencia de comandos incluya el shebang
  • Hazlo ejecutable
  • Agregue lo siguiente a las Aplicaciones de inicio:

    /bin/bash -c "sleep 15 && while true; do <path_to_your_script.sh> ; sleep 300; done"

    Tablero> Aplicaciones de inicio> Agregar. Agrega el comando:

    /bin/bash -c "sleep 15 && while true; do <path_to_your_script.sh> ; sleep 300; done"

Explicación

Si ejecuta el script desde su propio entorno (por ejemplo, desde una ventana de terminal o desde aplicaciones de inicio), se establecerán varias variables de entorno. cronsin embargo, ejecuta su script con un conjunto limitado de variables de entorno.
Dado que su script, sin duda, utiliza el gsettingscomando:

gsettings get org.gnome.desktop.background picture-uri <wallpaper>

para configurar el fondo de pantalla, es casi seguro que el comando se romperá cuando se ejecute cron.

La desventaja de "la solución perezosa" es puramente teórica. Un comando que duerme prácticamente continuamente no significa nada para su sistema.

Información adicional; alternativamente

Al leer esta publicación , y de las experiencias del pasado, estoy bastante seguro de que la DBUS_SESSION_BUS_ADDRESSvariable de entorno debe establecerse.

Para hacerlo, agregue la siguiente sección al comienzo de su secuencia de comandos (debajo del shebang):

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

Entonces deberías poder ejecutarlo con éxito cron.

Sin embargo, podría muy bien guardar el ajetreo y elegir la opción perezosa.

Jacob Vlijm
fuente
@AleksanderMahnyov De nada. Me alegro de que funcione :)
Jacob Vlijm
2
Es mucho mejor usar un trabajo cron.
Luka Ramishvili
1
@LukaRamishvili Gracias por el comentario. Sin embargo: a. ¿Y por qué es eso? un comando de suspensión no significa nada para su sistema. si. Incluso incluí la opción.
Jacob Vlijm
1
De lo contrario, una buena investigación sobre las variables de sesión de gnome, ayudaría mucho al OP, ya que eso sería necesario de cualquier manera.
Luka Ramishvili
2
Acabo de mirar: cpu 0.0%¿De qué impuesto estamos hablando?
Jacob Vlijm
24

Ponlo en tu crontab.

Abre tu cronmesa por:

crontab -e

Ahora agregue:

*/5 * * * * /path/to/script.sh

No olvide hacer el script ejecutable de antemano.


Como su script depende de X, probablemente sea una buena idea agregarlo DISPLAYal entorno del script:

*/5 * * * * DISPLAY=:0 /path/to/script.sh

Reemplace :0con su actual DISPLAY(se puede encontrar en una echo $DISPLAYsesión interactiva).

Si es necesario, también puede agregar la XAUTHORITYvariable de entorno:

*/5 * * * * DISPLAY=:0 XAUTHORITY="~/.Xauthority" /path/to/script.sh

Nuevamente puedes encontrar el valor por echo $XAUTHORITY.

heemayl
fuente
1
No estoy seguro si funciona con variables de entorno limitadas de cron, pero veamos si OP menciona que funciona :)
Jacob Vlijm
1
@AleksanderMahnyov Por favor edite su pregunta para agregar el script, difícil de decir sin ver el contenido ... DISPLAYXAUTHORITY
posiblemente
1
@Kartagis Cron no puede manejar segundos, también estás tratando de hacerlo durante horas, lo que sigue siendo sintácticamente incorrecto ..
heemayl
2
Me encanta este método en lugar del "método perezoso", porque sabía sobre cron, pero necesitaba un curso de actualización. Esto es exactamente lo que hice, muchas gracias! :)
ZaxLofful
2
Mejor enfoque que la respuesta aceptada. :)
Sandeep Kumar