web-dev-qa-db-fra.com

Mon script fonctionne correctement lorsque je l’exécute depuis le terminal, mais il ne fonctionne pas avec cron. Pourquoi?

Je crée un script pour gérer mes icônes et j'utilise la commande gvfs-set-attribute pour le faire. Le script fonctionne correctement lorsque je l'exécute avec le terminal, mais il échoue lorsque j'utilise cron. Voici une version simplifiée de mon problème:

#!/bin/bash

PATH=/home/myUser/bin:/home/myUser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/myUser/.local/share/gvfs-metadata

gvfs-set-attribute -t string /home/myUser/myFolder metadata::custom-icon file:///home/myUser/myImage.png

J'ai utilisé crontab -e et réglé mon script pour qu'il s'exécute chaque minute * * * * * /home/myUser/script.bash. Le problème est que ce script ne fonctionne pas du tout lorsque je l'exécute avec cron.

J'ai déjà écrit le PATH sur mon script, comme décrit dans this autre problème et le résultat de la commande whereis gvfs-set-attribute est:

gvfs-set-attribute: /usr/bin/gvfs-set-attribute /usr/share/man/man1/gvfs-set-attribute.1.gz

Donc, je suppose qu’il n’ya rien de mal à la PATH ici. J'ai également essayé d'exécuter mon script directement avec le chemin absolu: /usr/bin/gvfs-set-attribute. Mais toutes ces choses ont fonctionné ... Quelqu'un a-t-il une idée de ce qui se passe et pourquoi je ne peux pas utiliser la commande gvfs-set-attribute avec cron?

2
Rafael Muynarsk

Essayez d’ajouter cette ligne à votre script (évidemment avant l’appel à gvfs-set-attribute):

export $(cat /proc/$(pgrep gnome-session)/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS)

Il récupère la variable d'environnement DBUS_SESSION_BUS_ADDRESS de votre session de gnome existante. Cela fait cependant deux hypothèses:

  1. Vous exécutez une session de gnome; et
  2. Il n'y a qu'une session de gnome

S'il existe plusieurs sessions gnome (une pour chaque utilisateur), vous pouvez modifier cette ligne pour qu'elle fonctionne pour un utilisateur spécifique en ajoutant l'option -u à pgrep. Par exemple:

export $(cat /proc/$(pgrep gnome-session -u myUser)/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS)

Si vous n'utilisez pas gnome, je pense que cela fonctionnera avec d'autres environnements de bureau en remplaçant gnome-session par une autre valeur, telle que lxsession pour LXDE.

1
Brendan McGrath

Les travaux cron ne s'exécutent pas sous le système X Window et n'accèdent généralement pas aux objets d'interface graphique.

Cependant, vous pouvez tricher.

Dans un terminal, fonctionnant sous l'interface graphique:

xhost +localhost

echo "export DISPLAY=\"$DISPLAY\"" >$HOME/.display

Et, au début du travail cron:

source $HOME/.display

Lire man xhost.

1
waltinator