1 votes

crontab ne veut pas exécuter mon script

J'ai essayé de faire en sorte qu'un script s'exécute au démarrage, mais sans succès. crontab

@reboot /bin/sleep 8s && /bin/bash /home/user/reconnect.sh > /home/user/reconnect.log 2>&1

Le script fonctionne bien si je l'exécute à la main.

#!/bin/bash

# If started as root, then re-start as user "user":
if [ "$(id -u)" -eq 0 ]; then
    exec sudo -H -u user $0 "$@"
    echo "This is never reached.";
fi
echo "This runs as user $(id -un)";

while [ "true" ]
do
        VPNCON=$(/bin/nmcli con | /bin/grep PureVPN_PPTP | /bin/cut -f18 -d " ")
        if [[ $VPNCON != ens3 ]]; then
                /bin/echo "Disconnected, trying to reconnect..."
                (/bin/sleep 1s && /bin/nmcli con up uuid 1dfcb9f6-1b90-3d92-9f8b-106dc35da0f4)
        elif    IP=$(ifconfig ppp0 | awk '/inet/{print $2; exit}')
                (/bin/sleep 5s)
                [ "$IP" != "xxx.xxxx.xxx.xxx" ]; then
                /bin/echo "wrong IP: $IP"
                (/bin/sleep 1s && /bin/nmcli con down uuid 1dfcb9f6-1b90-3d92-9f8b-106dc35da0f4 && /bin/sleep 2s && /bin/nmcli con up uuid 1dfcb9f6-1b90-3d92-9f8b-106dc35da0f4)
        else
                /bin/echo "Already connected !"
        fi
        /bin/sleep 30
done

Depuis le post initial, j'ai travaillé un peu sur le script. Il fonctionne bien exécuté manuellement.

Exécuté par crone en tant qu'utilisateur, j'obtiens l'erreur suivante :

This runs as user user
Disconnected, trying to reconnect...
Error: Connection activation failed: Not authorized to control networking.

D'une manière ou d'une autre, l'utilisateur n'a pas les mêmes droits que le cron lui-même. Le problème est que, lorsqu'il est exécuté en tant que root, il échoue également. Les informations d'identification pour le vpn sont stockées dans le trousseau de clés de l'utilisateur, donc root ne peut pas établir la connexion :-/

1voto

waltinator Points 32821

Les emplois passent par cron ou systemd Les scripts de démarrage ne sont pas exécutés dans le même environnement d'exécution que celui que vous avez sur votre bureau. systemd Les scripts de démarrage sont exécutés en tant que root . Aucun de vos PATH ou d'autres paramètres de variables d'environnement sont automatiquement propagés à votre ordinateur. cron travail. Par exemple, il n'y a pas $DISPLAY Les programmes GUI nécessitent donc un traitement spécial (lire man xhost ).

On peut définir des variables d'environnement pour tous ses cron emplois dans le crontab fichier Lire man 5 crontab .

Regardez les résultats de echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias dans chacun de vos environnements.

Depuis le command partie de la crontab est, par défaut, interprétée par /bin/sh qui a une syntaxe plus simple que /bin/bash je recommande d'avoir command être un appel à un bash script (exécutable, monté, commence par #!/bin/bash ) qui configure l'environnement, puis appelle le programme souhaité.

0voto

Sturmkater Points 11

Merci, Steeldrive :-) Je suppose qu'une fois que vous commencez avec l'interface graphique, vous êtes condamné à vous y tenir. Votre suggestion fonctionne à merveille.

@Sturmkater cela ressemble à quelque chose que vous devriez faire via les applications de démarrage de votre utilisateur plutôt que via cron. applications de démarrage de l'utilisateur, plutôt que via cron. Voir par exemple Comment puis-je lancer des applications automatiquement à la connexion ? - conducteur d'acier

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X