J'ai un travail cron qui exécute un script. Lorsque j'exécute le script via un shell interactif (ssh'ed to bash), cela fonctionne très bien. Lorsque le script s'exécute de lui-même via cron, il échoue.
Je suppose qu'il utilise certaines des variables d'environnement définies dans le shell interactif. Je vais dépanner le script et les supprimer.
Après avoir apporté des modifications, je sais que je pourrais mettre le script en file d'attente dans cron pour qu'il s'exécute normalement, mais existe-t-il un moyen de l'exécuter à partir de la ligne de commande, mais de lui dire de s'exécuter comme il le ferait à partir de cron - c'est-à-dire dans un environnement non interactif?
unset
.env
, et vous voudrez peut-être essayerenv -i ./my-script.sh
. De plus, recevez-vous un message d'erreur?Réponses:
Les principales différences entre l'exécution d'une commande à partir de cron et l'exécution sur la ligne de commande sont les suivantes:
/bin/sh
);cron(8)
oucrontab(5)
; généralement il y a justeHOME
, peutSHELL
-êtreLOGNAME
, peutUSER
- être , et une petitePATH
);%
personnage spécialement (il est transformé en une nouvelle ligne);L'invocation suivante exécutera l'extrait de shell à peu près comme s'il avait été appelé à partir de cron. Je suppose que l'extrait ne contient pas les caractères
'
ou%
.Voir aussi l' exécution d'un script sh à partir du cron , ce qui pourrait aider à résoudre votre problème.
la source
sudo -u user /path/to/script
serait également un moyen de l'exécuter sans aucun ensemble de variables?sudo
efface certaines variables et définit d'autres à une valeur connue, mais cela dépend de la façon dont il est configuré. Il est souvent configuré pour conserver les paramètres régionaux etTERM
, par exemple.Depuis le lien de @ sr_ ( Comment obtenir un environnement propre dans un shell ksh? ), J'ai recherché env, et vous voudrez peut-être essayer ceci:
la source
echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.sh
sortiesinteractive himB
.Je vous suggère d'utiliser des chemins absolus pour vos scripts lorsque vous les mettez dans cron et que vous les utilisez ailleurs et pour toutes les commandes linux qui y sont utilisées, mieux les déclarer comme variables et les utiliser!
la source
Cron n'utilise pas nécessairement le même shell que vous utilisez. vérifier:
Pour déterminer le shell et tenter d'exécuter votre script là-bas, cela fonctionne-t-il? C'est une cause fréquente de problèmes pour de nombreuses personnes qui ajoutent des scripts à cron.
Si c'est le problème - vous pouvez ajouter "bash" au début de votre script dans cron pour forcer ce script à s'exécuter dans bash. Si cela ne résout pas le problème, faites-le moi savoir et je creuserai un peu plus.
la source
Si vous souhaitez ignorer certaines questions interactives fournies par un script, vous pouvez essayer:
Ou
yes "n"
si vous souhaitez répondre à toutes les questions.la source
Pour exécuter votre script dans un shell non interactif (sans égard aux détails de
cron
), vous pouvez le faire viassh
.Testez si vous vous retrouvez vraiment dans un shell non interactif:
Exécutez le script dans un shell non interactif:
la source