J'ai un script bash qui effectue plusieurs opérations sur les fichiers. Quand un utilisateur exécute ce script, il s'exécute avec succès et affiche quelques lignes de texte, mais lorsque j'essaie de le lancer, il y a des problèmes. Il semble fonctionner (je vois une entrée dans cron log montrant qu'il a été lancé) mais rien ne se passe, il ne sort rien et ne fait aucune de ses opérations de fichiers. Il n'apparaît pas non plus dans les processus en cours d'exécution, il semble donc disparaître immédiatement. Après un dépannage, j'ai trouvé que la suppression de "set -e" résolvait le problème, il fonctionne maintenant à partir du système cron sans problème. Donc ça marche, mais je préfèrerais avoir mis -e activé pour que le script se termine s'il y a une erreur. Est-ce que quelqu'un sait pourquoi "set -e" provoque la sortie de mon script?
Merci pour l'aide,
RyanPourquoi l'utilisation de set -e fait-elle échouer mon script lorsqu'il est appelé dans crontab?
Répondre
Lorsque votre script fonctionne sous Cron, les variables d'environnement et chemin peuvent être réglés différemment que lorsque le script est exécuté directement par un utilisateur. Peut-être c'est pourquoi il se comporte différemment?
Pour tester ceci: créez un nouveau script qui ne fait rien d'autre que printenv
et echo $PATH
. Exécutez ce script manuellement, en enregistrant la sortie, puis en l'exécutant comme un travail cron, en sauvegardant cette sortie. Comparez les deux environnements. Je suis sûr que vous trouverez des différences ... un shell de connexion interactif aura eu son environnement mis en place en fournissant un ".login", ".bash_profile", ou un script similaire (selon le shell de l'utilisateur). Cela ne se produit généralement pas dans un travail cron , ce qui est généralement la raison pour laquelle un travail cron se comporte différemment de l'exécution du même script dans un shell de connexion .
Pour résoudre ce problème: En haut du script, soit explicitement défini les variables d'environnement et PATH pour correspondre à l'environnement interactif, ou la source « .bash_profile », « .login », ou un autre script de configuration de l'utilisateur, en fonction de la coque qu'ils utilisent.
Je suis d'accord Jim. Sauf que le cron est exécuté en tant qu'utilisateur que je peux désactiver le script manuellement sans problème. Appelons-le user1 ... Si j'ouvre une session ssh et que je me connecte en tant qu'utilisateur1, puis exécutez /scripts/myscript.sh cela fonctionne très bien mais si j'ajoute le script comme un processus quotidien au cron de user1, il ne termine jamais une course et aucun les erreurs sont générées. Si je supprime "set -e" du début de mon script, il s'exécute correctement à partir de cron et il n'y a pas d'erreur dans stdout ou stderr bien que la sortie du script standard apparaisse. Je suis totalement perplexe sur ce ... – SDGuero
@SDGuero: J'ai développé mon explication de ce qui se passe probablement, avec quelques conseils de dépannage supplémentaires. J'espère que cela t'aides. –
Avec set -e
, le script s'arrêtera à la première commande qui donne un statut de sortie différent de zéro. Cela ne signifie pas nécessairement que vous verrez un message d'erreur.
Voici un exemple, utilisant la commande false
qui ne fait que quitter avec un état d'erreur.
Sans set -e
:
$ cat test.sh
#!/bin/sh
false
echo Hello
$ ./test.sh
Hello
$
Mais le même script avec set -e
sorties sans imprimer quoi que ce soit:
$ cat test2.sh
#!/bin/sh
set -e
false
echo Hello
$ ./test2.sh
$
Sur la base de vos observations, il semble que votre script échoue pour une raison quelconque (liée vraisemblablement à l'environnement différent, comme Jim Lewis l'a suggéré) avant qu'il ne génère une sortie.
Pour déboguer, ajoutez set -x
au début du script (ainsi que set -e
) pour afficher les commandes lors de leur exécution.
- 1. Crontab sans crontab -e
- 2. subprocess.Popen semble échouer lorsqu'il est exécuté de crontab
- 3. Pourquoi context_info peut échouer?
- 4. EveryOne Min Script est appelé
- 5. Stockage du fichier crontab dans mon projet
- 6. crontab script python wont exécuter
- 7. Comment faire pour échouer rapidement un script python s'il est appelé à partir d'un mauvais interpréteur?
- 8. Crontab dans Plesk
- 9. Pourquoi mon emplacement n'est-il pas appelé?
- 10. Pourquoi mon TypeConverter n'est pas appelé?
- 11. Pourquoi mon destructeur n'est jamais appelé?
- 12. Pourquoi mon script python est-il tué de manière aléatoire?
- 13. Pourquoi Javascript est pas appelé
- 14. Pourquoi/quand ComponentListener.componentShown() est appelé?
- 15. Pourquoi l'événement form_load n'est pas appelé dans mon application Winforms?
- 16. Pourquoi DwmRegisterThumbnail peut-il échouer?
- 17. Pourquoi l'événement Format de liaison est-il appelé deux fois?
- 18. Pourquoi someInputElement.type = 'button'; échouer dans IE?
- 19. Mon script php n'envoie pas d'e-mail lorsqu'il est appelé par un travail cron
- 20. Pourquoi mon E/S n'est-elle pas exécutée dans l'ordre?
- 21. Pourquoi mon script simple fastCGI Perl échoue?
- 22. PHP générer un crontab
- 23. Pourquoi mon constructeur par défaut n'est-il pas appelé ici? Pourquoi mon constructeur par défaut n'est-il pas appelé ici?
- 24. Variables dans crontab?
- 25. Entrées de script de dérangement pour set-Umserver cmd let
- 26. Pourquoi mon délégué CLLocationmanager n'est-il pas appelé?
- 27. Pourquoi le finaliseur de NHibernate AdoTransaction est-il appelé?
- 28. Pourquoi onKey() est appelé deux fois?
- 29. Impossible de faire fonctionner Crontab
- 30. Pourquoi GetControllerInstance() de mon usine de contrôleur Castle Windsor est-il appelé avec une valeur nulle?
Si 'set -e' le fait sortir en cas d'erreur ... cela ne veut-il pas dire qu'il y a une erreur quelque part? –
Le script s'exécute si je l'exécute manuellement. Als, s'il rencontre des problèmes, le code d'erreur devrait être imprimé sur stdout avant qu'il ne se termine. Cela n'arrive pas. – SDGuero
Sauf si vous montrez votre script, nous ne pouvons pas dire quel pourrait être le problème.De plus, à mon avis, 'set -e' ne remplace pas la gestion correcte des erreurs et ne devrait pas être utilisé du tout. –