J'ai normalement plusieurs problèmes avec la façon dont cron exécute les scripts car ils n'ont normalement pas la configuration de mon environnement. Existe-t-il un moyen d'invoquer bash (?) De la même manière que cron pour que je puisse tester les scripts avant de les installer?
253
Réponses:
Ajoutez ceci à votre crontab (temporairement):
Après son exécution, procédez comme suit:
Cela suppose que votre cron exécute / bin / sh, qui est la valeur par défaut indépendamment du shell par défaut de l'utilisateur.
la source
env -
cat ~ / cronenv` / bin / sh` doit également être écrit comme tâche cron? veuillez donner un exempleCron fournit uniquement cet environnement par défaut:
HOME
répertoire personnel de l'utilisateurLOGNAME
connexion de l'utilisateurPATH=/usr/bin:/usr/sbin
SHELL=/usr/bin/sh
Si vous avez besoin de plus, vous pouvez source un script où vous définissez votre environnement avant la table de planification dans la crontab.
la source
.
ne fait généralement plus partiePATH
, pour des raisons de sécurité .Quelques approches:
Exportez cron env et sourcez-le:
Ajouter
à votre crontab, laissez-le fonctionner une fois, éteignez-le, puis exécutez
Et vous êtes maintenant dans une
sh
session qui a l'environnement de cronApportez votre environnement à cron
Vous pouvez sauter l'exercice ci-dessus et faire juste
. ~/.profile
devant votre tâche cron, par exempleUtiliser l'écran
Au-dessus de deux solutions échouent toujours en ce qu'elles fournissent un environnement connecté à une session X en cours d'exécution, avec accès à
dbus
etc. Par exemple, sur Ubuntu,nmcli
(Network Manager) fonctionnera dans les deux approches ci-dessus, mais échouera toujours dans cron.Ajoutez la ligne ci-dessus au cron, laissez-la fonctionner une fois, désactivez-la. Connectez-vous à votre session écran (screen -r). Si vous vérifiez que la session écran a été créée (avec
ps
) sachez qu’elles sont parfois en majuscules (par exempleps | grep SCREEN
)Maintenant, même
nmcli
et similaire échouera.la source
Tu peux courir:
Cela exécutera votre_commande avec un environnement vide.
la source
env - HOME="$HOME" LOGNAME="$USER" PATH="/usr/bin:/bin" SHELL="$(which sh)" command arguments
ce qui semble faire l'affaireSelon le shell du compte
ou
De http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
la source
Réponse six ans plus tard: le problème de l'inadéquation de l'environnement est l'un des problèmes résolus par
systemd
"timers" en remplacement de cron. Que vous exécutiez le "service" systemd à partir de la CLI ou via cron, il reçoit exactement le même environnement, évitant ainsi le problème de non-concordance de l'environnement.Le problème le plus courant pour provoquer l'échec des tâches cron lorsqu'elles passent manuellement est la valeur
$PATH
par défaut restrictive définie par cron, qui est celle-ci sur Ubuntu 16.04:En revanche, la valeur
$PATH
par défaut définiesystemd
sur Ubuntu 16.04 est:Il y a donc déjà une meilleure chance qu'un temporisateur systemd puisse trouver un binaire sans autre tracas.
L'inconvénient avec les minuteries systemd, c'est qu'il y a un peu plus de temps pour les configurer. Vous créez d'abord un fichier "service" pour définir ce que vous voulez exécuter et un fichier "timer" pour définir le planning d'exécution et enfin "activez" le timer pour l'activer.
la source
Créez un travail cron qui exécute env et redirige stdout vers un fichier. Utilisez le fichier à côté de "env -" pour créer le même environnement qu'une tâche cron.
la source
N'oubliez pas que puisque le parent de cron est init, il exécute des programmes sans terminal de contrôle. Vous pouvez simuler cela avec un outil comme celui-ci:
http://libslack.org/daemon/
la source
Par défaut,
cron
exécute ses travaux en utilisant l'idée de votre systèmesh
. Cela pourrait être le shell Bourne réel oudash
,ash
,ksh
oubash
(ou un autre) un lien symbolique poursh
(et par conséquent l' exécution en mode POSIX).La meilleure chose à faire est de vous assurer que vos scripts ont ce dont ils ont besoin et de supposer que rien n'est prévu pour eux. Par conséquent, vous devez utiliser les spécifications de répertoire complètes et définir des variables d'environnement telles que
$PATH
vous.la source
0 0 * * 1 /path/to/executable >/dev/null 2>&1
puis, dans "exécutable", je définirais des valeurs pour$PATH
, etc., et utiliserais les spécifications complètes du répertoire pour entrer et sortir des fichiers, etc. Par exemple:/path/to/do_something /another/path/input_file /another/path/to/output_file
Un autre moyen simple que j'ai trouvé (mais qui peut être sujet à des erreurs, je suis toujours en train de tester) est de source les fichiers de profil de votre utilisateur avant votre commande.
Modification d'un script /etc/cron.d/:
Deviendrait:
Sale, mais ça a fait le travail pour moi. Existe-t-il un moyen de simuler une connexion? Juste une commande que vous pourriez exécuter?
bash --login
n'a pas fonctionné. Il semble que ce serait la meilleure façon de procéder.EDIT: Cela semble être une solution solide: http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
la source
La réponse acceptée donne un moyen d'exécuter un script avec l'environnement que cron utiliserait. Comme d'autres l'ont souligné, ce n'est pas le seul critère nécessaire pour déboguer les tâches cron.
En effet, cron utilise également un terminal non interactif, sans entrée attachée, etc.
Si cela aide, j'ai écrit un script qui permet d'exécuter sans douleur une commande / script comme il serait exécuté par cron. Invoquez-le avec votre commande / script comme premier argument et vous êtes bon.
Ce script est également hébergé (et éventuellement mis à jour) sur Github .
la source
La réponse https://stackoverflow.com/a/2546509/5593430 montre comment obtenir l'environnement cron et l'utiliser pour votre script. Mais sachez que l'environnement peut différer selon le fichier crontab que vous utilisez. J'ai créé trois entrées cron différentes pour sauvegarder l'environnement via
env > log
. Ce sont les résultats sur un Amazon Linux 4.4.35-33.55.amzn1.x86_64.1. Global / etc / crontab avec l'utilisateur root
2. Utilisateur crontab de root (
crontab -e
)3. Script dans /etc/cron.hourly/
Plus important encore
PATH
,PWD
etHOME
diffèrent. Assurez-vous de les définir dans vos scripts cron pour qu'ils reposent sur un environnement stable.la source
Je ne pense pas qu'il y en ait; le seul moyen que je connaisse pour tester un travail cron est de le configurer pour qu'il s'exécute une minute ou deux à l'avenir, puis d'attendre.
la source