web-dev-qa-db-fra.com

Le travail périodique à exécuter python le script au redémarrage ne fonctionne pas

Je suis nouveau sur Linux et j'ai lu et suivi de nombreuses instructions pour exécuter un script python au redémarrage, mais aucune d'entre elles n'a fonctionné:

voici la commande que je veux exécuter:

/usr/bin/python3 /home/am/projects/AMAcc/map.py

J'ai utilisé crontab -e et ajouté

@reboot /usr/bin/python3 /home/am/projects/AMAcc/map.py

J'ai essayé Sudo crontab -e et ajouté la même commande

J'ai même édité le fichier /etc/crontab et ajouté la commande ci-dessus.

J'ai essayé d'ajouter #!/usr/bin/python3 en haut de mon code python et de modifier ses autorisations, par exemple: Sudo chmod a+x map.py

Comme les documents le suggéraient, tous les utilisateurs seraient en mesure d'exécuter des tâches cron si le fichier cron.deny existait mais était vide. J'ai donc essayé de créer des fichiers cron.deny vides dans /etc/cron.deny et /usr/lib/cron/cron.deny. Mais toujours pas de chance en cours d'exécution du travail cron.

Qu'est-ce que je fais porté?

Pour exécuter une application graphique à partir de Cron, vous devez exporter quelques variables d'environnement de bureau. Dans la plupart des cas, il suffit d'exporter la valeur actuelle de $DISPLAY. Je vous suggère de créer un script de démarrage supplémentaire (bash), qui lancera votre application.

Dans cette réponse est fournie une méthode robuste pour rechercher et exporter la valeur $DISPLAY de l'utilisateur actuel. Mais il y a un problème. Tant que l'utilisateur n'est pas connecté au DE, la valeur $DISPLAY n'est pas définie. Nous pourrions donc ajouter une condition supplémentaire, comme si elle était faite dans cela répond :

# Get the value of the $DISPLAY variable for the current user. Unset it just in case this is a `ssh -X` connection
unset DISPLAY;
while [ "$DISPLAY" == "" ]; do
        export DISPLAY=$(w "$USER" | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}' 2>/dev/null) && sleep 3
done
  • Cette condition fonctionne dans tous les autres cas, mais elle échoue dans les tâches @reboot Cron et je ne peux pas en comprendre la raison. Ainsi, dans le script ci-dessous, une autre approche est utilisée pour vérifier si l'utilisateur est connecté à Mate.

Certaines applications ont besoin de quelques variables supplémentaires (voir par exemple this et this ) comme $DBUS_SESSION_BUS_ADDRESS et $DESKTOP_SESSION. À mon avis, la meilleure approche consiste à trouver le processus de session de l'utilisateur actuel dans le répertoire /proc (pseudo-système de fichiers), et exporter toutes les variables du fichier environ qui se trouve dans /proc/process-number.

J'ai créé un petit projet, appelé cron-gui-launcher dédié à cela. Cela fonctionne mais ce n'est pas testé pour tous les cas d'utilisateurs (comme le cas actuel). Ici, j'ai extrait la partie essentielle qui fait référence à Mate DE et apporté la modification mentionnée ci-dessus.

1. Créez un fichier exécutable avec ce contenu:

#!/bin/bash -e

# Check whether the user is logged in Mate
while [ -z "$(pgrep mate-session -n -U $UID)" ]; do
        sleep 3 && count=$((count+1)) && echo "$count" > /tmp/mate-cron.log
done

# Get the content of the Current-Desktop-Session Environment File as an array:
EnvVarList=`cat -e "/proc/$(pgrep mate-session -n -U $UID)/environ" | sed 's/\^@/\n/g'`

# Export the Current-Desktop-Session Environment Variables:
for EnvVar in $EnvVarList; do
        echo "$EnvVar" >> /tmp/mate-cron.log
        export "$EnvVar"
done

# Execute the list of the input commands
Nohup "${1}" >/dev/null 2>&1 &

exit 0

2. Maintenant dans crontab, utilisez:

@reboot /path-to-the/script "your-application"

3. Notes:

  • Ce script ne fonctionnera pas avec la racine crontab de la racine. En raison des variables $UID et $USER. Vous pouvez les remplacer par l'UID et le nom de l'utilisateur.

  • Pour les autres DE, changez mate-session à partir de cette partie $(pgrep mate-session -n -U $UID) avec le nom du processus de l'autre DE, par exemple gnome-session.

  • Peut-être que pour les applications graphiques, exécutées au démarrage du système, il est préférable de créer une entrée dans les applications de démarrage . Pour le compagnon DE: Control Centre > Personal > Startup Applications ( source ).

4. Voici comment fonctionne le script:

enter image description here

5
pa4080