web-dev-qa-db-fra.com

comment puis-je faire en sorte que cron exécute un travail pour le test / débogage? sans changer d'horaire!

J'ai un travail cron qui doit être exécuté tous les jours, à part changer la planification, existe-t-il une autre façon de faire un test de la commande en ce moment pour voir si elle fonctionne comme prévu?

EDIT: (à partir des commentaires) Je sais que la commande fonctionne correctement lorsqu'elle est entrée dans Shell (mon Shell), mais je veux savoir si elle fonctionne correctement lorsque Cron l'exécute, elle pourrait être affectée par des choses spécifiques à ENV ou Shell (~ expansion ) ou de propriété et de permission ou ...

165
Ali

Pour autant que je sache, il n'y a aucun moyen de le faire directement car cron a un but spécial - exécuter des commandes de programmes à un moment précis. La meilleure chose à faire est donc de créer manuellement une entrée crontab ou d'écrire un script qui supprime et réinitialise l'environnement.

33
Ulrich Dangel

Vous pouvez forcer l'exécution de crontab avec la commande suivante:

run-parts /etc/cron.daily
72
Vadim Sluzky

Vous pouvez simuler l'environnement utilisateur cron comme expliqué dans "Exécuter un travail cron manuellement et immédiatement" . Cela vous permettra de tester le travail fonctionne quand il serait exécuté en tant qu'utilisateur cron.


Extrait du lien:


Étape 1 : Je mets cette ligne temporairement dans la crontab de l'utilisateur:

* * * * *   /usr/bin/env > /home/username/tmp/cron-env

puis je l'ai retiré une fois le fichier écrit.

Étape 2 : Je me suis fait un petit script bash run-as-cron contenant:

#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"

Alors, en tant qu'utilisateur en question, j'ai pu

run-as-cron /the/problematic/script --with arguments --and parameters
54
Michael Barton

CronitorCLI a une commande cronitor select qui vous permet de sélectionner et d'exécuter n'importe quel travail cron à partir de la ligne de commande. Vous n'avez pas besoin de créer un compte Cronitor pour l'utiliser.

https://cronitor.io/docs/using-cronitor-cli

Voici un exemple:

ubuntu@ip-10-0-0-112:~$ cronitor select

Use the arrow keys to navigate: ↓ ↑
? Select job to run:
▸ /var/runner/src/bin/batch_reports.py runner.settings.prod
  /var/runner/src/bin/trigger_reports.py runner.settings.prod
  ... etc ...
6
Shane H

J'ai trouvé une solution qui semble être un peu meilleure pour mes besoins (les commandes affichées pour CentOS/RHEL-like, mais devraient être adaptables essentiellement n'importe où).

Cela nécessite libfaketime - vous pouvez le construire vous-même à partir des sources à https://github.com/wolfcw/libfaketime ou utilisez simplement l'un des nombreux packages de https: //pkgs.org/download/libfaketime .

  1. Arrêter le service Crond - service crond stop
  2. Déterminez quand votre service devrait être exécuté par - https://crontab.gur est assez utile pour cela.
  3. Exécutez crond en mode premier plan via l'outil faketime de libfaketime (il vous permet de simuler l'appel système pour les recherches de temps pour tous les processus enfants).
    1. Je ne ferais pas ça sur un serveur de production
    2. faketime '2019-10-17 07:59:50' /usr/sbin/crond -n -x test,sch
[root@user-crontesting-dvc-01 ~]# faketime '2019-10-17 07:59:50' /usr/sbin/crond -n -x sch
debug flags enabled: sch
[4841] cron started
log_it: (CRON 4841) INFO (Syslog will be used instead of sendmail.)
log_it: (CRON 4841) INFO (RANDOM_DELAY will be scaled with factor 34% if used.)
log_it: (CRON 4841) INFO (running with inotify support)
[4841] GMToff=0
log_it: (CRON 4841) INFO (@reboot jobs will be run at computer's startup.)
[4841] Target time=1571299200, sec-to-wait=11
user [root:0:0:...] cmd="/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1"
[4841] Target time=1571299260, sec-to-wait=60
log_it: (root 4844) CMD (/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1)
log_it: (root 4843) CMDOUT (/bin/bash: -c: line 0: syntax error near unexpected token `&')
log_it: (root 4843) CMDOUT (/bin/bash: -c: line 0: `/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1')
1
javanix

Pas très élégant, mais qui fonctionne: voici ce que j'utilise pour lancer le job à la 5ème ligne de mon crontab:

 eval "$(crontab -l | sed -n '5p' | tr -s ' ' | cut -d' ' -f 6-)"

Il affiche la crontab, obtient la 5e ligne, remplace plusieurs espaces par un seul espace, prend tout de la 6e colonne à la fin, puis la lance avec eval.

0
Basj

Je cite la réponse ( voir entièrement ) de serverfault :


Exécutez les commandes crontab en bloc:

crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done

pour l'exécuter sous un autre utilisateur:

Sudo -H -u username bash -c "crontab... "

0
T.Todua