(J'ai déjà lu Comment puis-je tester un nouveau script cron?. )
J'ai un problème spécifique (le travail cron ne semble pas s'exécuter correctement), mais le problème est général: j'aimerais déboguer les scripts cronés. Je suis conscient que je peux configurer une ligne crontab * * * * * *, mais ce n'est pas une solution pleinement satisfaisante. J'aimerais pouvoir exécuter un travail cron à partir de la ligne de commande comme s'il était exécuté par cron (même utilisateur, mêmes variables d'environnement, etc.). Y a-t-il un moyen de faire cela? Il n'est pas pratique de devoir attendre 60 secondes pour tester les modifications de script.
Réponses:
Voici ce que j'ai fait, et cela semble fonctionner dans cette situation. Au moins, cela me montre une erreur, alors que courir depuis la ligne de commande car l’utilisateur n’affiche pas l’erreur.
Étape 1 : Je mets cette ligne temporairement dans la crontab de l'utilisateur:
puis l'a sorti une fois que le fichier a été écrit.
Étape 2 : Je me suis fait un petit script bash en run-as-cron contenant:
Alors, en tant qu'utilisateur en question, j'ai pu
Cette solution pourrait évidemment être étendue pour utiliser sudo ou autre pour plus de flexibilité.
J'espère que cela aide les autres.
la source
/usr/bin
. 2) Lescat …/cron-env
sorties multi-lignes, ce qui ne fonctionne pas. Essayez simplement d’exécuter/usr/bin/env -i $(cat cron-env) echo $PATH
dans le terminal, il sort l’environnement littéralement au lieu de l’utiliser. 3) L’environnement actuel se déverse dans l’environnement cron émulé. Essayez:export foo=leaked; run-as-cron echo $foo
.cat
plusieurs lignes, ce qui fonctionne, car la substitution de shell les réduit en une seule ligne, sur laquelle vous pouvez vérifierecho $(cat cron-env ) | wc
; votre exemple de commande,/usr/bin/env -i $(cat cron-env) echo $PATH
substitue$PATH
du shell appelant; au lieu de cela, il devrait invoquer un sous-shell à substituer dans le sous-environnement, par exemple/usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'
. 3. Vous avez fait la même erreur, en substituant à nouveau dans la coquille d'appel au lieu de dans le sous-environnementJe présente une solution basée sur la réponse de Pistos, mais sans les défauts.
Ajoutez la ligne suivante à la crontab, par exemple en utilisant
crontab -e
Créez un script shell qui exécute une commande dans le même environnement que les tâches cron exécutées:
Utilisation:
par exemple
Notez que le second argument doit être cité s'il nécessite un argument. La première ligne du script charge un shell POSIX en tant qu'interpréteur. La deuxième ligne source le fichier d’environnement cron. Cela est nécessaire pour charger le shell correct, qui est stocké dans la variable d'environnement
SHELL
. Ensuite, il charge un environnement vide (pour éviter toute fuite de variables d’environnement dans le nouveau shell), lance le même shell qui est utilisé pour les tâches cron et charge les variables d’environnement cron. Enfin, la commande est exécutée.la source
Comme crontab ne fait pas le travail, vous manipulerez son contenu:
Ce qu'il fait :
la source
sudo -H -u otheruser bash -c 'crontab..."
lancer la crontab d’un autre utilisateurPar défaut avec la plupart des démons cron par défaut que j'ai vus, il n'y a tout simplement aucun moyen de dire à cron de fonctionner ici et maintenant. Si vous utilisez anacron, il est peut-être possible d’exécuter une instance distincte au premier plan.
Si vos scripts ne fonctionnent pas correctement, vous ne prenez pas en compte le fait que
De crontab (5):
En général, PATH est le plus gros problème. Vous devez donc:
Si vous devez exécuter le script en tant qu'utilisateur sans shell (par exemple, www-data), utilisez sudo:
La première chose à tester avant tout cela, bien sûr, est que votre script fait ce qu'il est censé faire depuis la ligne de commande. Si vous ne pouvez pas l'exécuter depuis la ligne de commande, cela ne fonctionnera évidemment pas avec cron.
la source
Le script de Marco n'a pas fonctionné pour moi pour une raison quelconque. Je n'avais pas le temps de déboguer, alors j'ai écrit un script Python qui fait la même chose. C'est plus long, mais: premièrement, cela fonctionne pour moi et deuxièmement, je le trouve plus facile à comprendre. Remplacez "/ tmp / cron-env" par l'emplacement où vous avez enregistré votre environnement. C'est ici:
la source
Eh bien, l'utilisateur est le même que celui que vous avez mis dans l'entrée de la crontab (ou la crontab dans laquelle vous l'avez insérée, alternativement), c'est donc une évidence.
crontab
(5) devrait vous donner la liste des variables d'environnement définies, il n'y en a que quelques-unes.la source
Dans la plupart des crontabs, comme par exemple vixie-cron, vous pouvez placer des variables dans la crontab elle-même, puis utiliser / usr / bin / env pour vérifier si cela fonctionne. De cette façon, vous pouvez faire fonctionner votre script dans crontab une fois que vous avez découvert ce qui ne va pas avec le script run-as-cron.
la source
La solution de Marco n'a pas fonctionné pour moi, mais le script python de Noam a fonctionné. Voici une légère modification du script de Marco qui l'a fait fonctionner pour moi:
Les
set -a
variables d’exportation ajoutées définies dans le script $ 1 et mises à la disposition de la commande $ 2Le psy de python de Noam a fonctionné car il "exportait" l'environnement vers le processus enfant.
la source
Si c'est un script shell, cela devrait vous rendre la majeure partie du chemin:
Cela soulignera certainement certains problèmes, sinon tout.
la source
Je n'ai jamais trouvé le moyen d'exécuter manuellement des tâches cron, mais cette rédaction suggère de définir le même environnement que celui que cronjob aurait et d'exécuter le script manuellement.
la source
vous pouvez programmer le travail pour commencer la minute suivante :)
la source
Je nouais sur la réponse de Marco. Le code est indiqué ci-dessous, mais je maintiendrai ce script ici .
Étant donné cette crontab:
Exemple de session d'utilisation:
C'est
cronTest2
ce qui doit être appelé correctement pour configurer les variables d'environnement de la même manière que le fait cron:cronTest
s'exécutecronTest2
avec le jeu de variables d'environnement approprié:la source