Exécution de .sh toutes les 5 minutes

12

J'ai un script .sh qui télécharge une photo du serveur du satellite japonais et la définit comme image de fond. Je l'ai mis dans la liste de démarrage, mais comment l'exécuter automatiquement toutes les 5 minutes, par exemple?

Aleksander Mahnyov
la source
1
Essayez cronmaker.com, vous pouvez y créer des expressions cron et les mettre avec crontab -e
We are Borg
2
L'image change-t-elle même toutes les 5 minutes? Essayez d'utiliser un intervalle qui crée moins de charge inutile sur le serveur cible. Ou assurez-vous de ne télécharger que si le fichier est vraiment modifié.
til_b
1
Soit dit en passant, quelle est l'URL pour les arrière-plans de l'espace?
bohdan_trotsenko

Réponses:

14

L'option paresseuse

Si vous voulez la méthode simple et évitez d'avoir à trouver quelle variable d'environnement définir:

  • Assurez-vous que votre script inclut le shebang
  • Rendez-le exécutable
  • Ajoutez les éléments suivants aux applications de démarrage:

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

    Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

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

Explication

Si vous exécutez le script à partir de votre propre environnement (par exemple à partir d'une fenêtre de terminal ou à partir d'applications de démarrage), un certain nombre de variables d'environnement seront définies. cronexécute cependant votre script avec un ensemble limité de variables d'environnement.
Puisque votre script utilise sans aucun doute la gsettingscommande:

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

pour définir le fond d'écran, la commande se cassera presque certainement lors de l'exécution cron.

L'inconvénient de "la solution paresseuse" est purement théorique. Une commande qui dort pratiquement en continu ne signifie rien pour votre système.

Information additionnelle; alternativement

En lisant ce post , et d'après les expériences passées, je suis presque sûr que la DBUS_SESSION_BUS_ADDRESSvariable d'environnement doit être définie.

Pour ce faire, ajoutez la section suivante au début de votre script (sous le shebang):

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

Ensuite, vous devriez pouvoir l'exécuter avec succès cron.

Vous pourriez cependant très bien sauver l'agitation et choisir l'option paresseuse.

Jacob Vlijm
la source
@AleksanderMahnyov Vous êtes les bienvenus. Heureux que ça marche :)
Jacob Vlijm
2
Il est tellement préférable d'utiliser un travail cron.
Luka Ramishvili
1
@LukaRamishvili Merci pour le commentaire. Cependant: a. Et pourquoi est-ce que? une commande de sommeil ne signifie rien pour votre système. b. J'ai même inclus l'option.
Jacob Vlijm
1
Sinon, de belles recherches sur les variables de session gnome, cela aiderait beaucoup l'OP, car cela serait nécessaire dans les deux cas.
Luka Ramishvili
2
Je viens de regarder: de cpu 0.0%quelle taxe parlons-nous?
Jacob Vlijm
24

Mettez-le dans votre crontab.

Ouvrez votre crontable en:

crontab -e

Ajoutez maintenant:

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

N'oubliez pas de rendre le script exécutable au préalable.


Comme votre script dépend de X, ce sera probablement une bonne idée d'ajouter le DISPLAYà l'environnement du script:

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

Remplacez :0par votre réel DISPLAY(peut être trouvé par echo $DISPLAYde la session interactive).

Si nécessaire, vous pouvez également ajouter la XAUTHORITYvariable d'environnement:

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

Encore une fois, vous pouvez trouver la valeur par echo $XAUTHORITY.

heemayl
la source
1
Je ne sais pas si cela fonctionne avec des variables d'environnement limitées de cron, mais voyons si OP mentionne que cela fonctionne :)
Jacob Vlijm
1
@AleksanderMahnyov Veuillez éditer votre question pour ajouter le script, difficile à dire sans voir le DISPLAYXAUTHORITY
contenu..peut-être un
1
@Kartagis Cron ne peut pas gérer les secondes, vous essayez également de le faire pendant des heures, ce qui est toujours syntaxiquement incorrect ..
heemayl
2
J'adore cette méthode plutôt que la "méthode paresseuse", car je connaissais Cron, mais j'avais besoin d'un peu de cours de recyclage. C'est exactement ce que j'ai fait, merci beaucoup! :)
ZaxLofful
2
Meilleure approche que la réponse acceptée. :)
Sandeep Kumar