web-dev-qa-db-fra.com

Comment configurer cron pour exécuter un fichier une seule fois à un moment précis?

Comment configurer cron pour exécuter un fichier une seule fois à un moment précis? L'une des alternatives est at mais elle n'est pas accessible à tous les utilisateurs sur les plans d'hébergement standard. Je me demandais donc s'il y avait moyen de le faire en utilisant cron?

38
Gajus

Essayez ceci pour exécuter une commande le 30 mars 2011 à minuit:

0 0 30 3 ? 2011  /command

AVERTISSEMENT : comme indiqué dans les commentaires, la colonne année n'est pas prise en charge en standard/implémentations par défaut de cron. Veuillez vous référer à la réponse de TomOnTime ci-dessous, pour un moyen approprié d'exécuter un script à un moment précis dans le futur dans les implémentations standard de cron.

33
gparis

Vous voulez vraiment utiliser at. Il est exactement fait à cet effet.

echo /usr/bin/the_command options | at now + 1 day

Cependant, si vous n'avez pas at, ou que votre hébergeur ne vous y donne pas accès, vous pouvez avoir un code cron de travail qui s'assure qu'il ne s'exécute qu'une seule fois.

Configurer une entrée cron avec une heure très précise:

0 0 2 12 * /home/adm/bin/the_command options

Suivant/home/adm/bin/the_command doit soit s'assurer qu'il ne s'exécute qu'une seule fois.

#! /bin/bash

COMMAND=/home/adm/bin/the_command
DONEYET="${COMMAND}.alreadyrun"

export PATH=/usr/bin:$PATH

if [[ -f $DONEYET ]]; then
  exit 1
fi
touch "$DONEYET"

# Put the command you want to run exactly once here:
echo 'You will only get this once!' | mail -s 'Greetings!' [email protected]
49
TomOnTime

Vous voulez vraiment l'utiliser sur. Il est exactement fait à cet effet.

echo /usr/bin/the_command options | at now + 1 day

Cependant, si vous n'en avez pas ou que votre hébergeur ne vous y donne pas accès, vous pouvez créer une entrée cron à suppression automatique.

Malheureusement, cela supprimera toutes vos entrées cron. Cependant, si vous n'en avez qu'un, c'est très bien.

0 0 2 12 * crontab -r ; /home/adm/bin/the_command options

La commande crontab -r supprime votre entrée crontab. Heureusement, le reste de la ligne de commande s'exécutera toujours.

AVERTISSEMENT: c'est dangereux! Il supprime TOUTES les entrées cron. Si vous en avez plusieurs, cela les supprimera tous, pas seulement celui qui a la ligne "crontab -r"!

14
TomOnTime

Vous pouvez mettre un fichier crontab dans /etc/cron.d qui exécuterait un script qui exécuterait votre commande, puis supprimerait le fichier crontab dans /etc/cron.d. Bien sûr, cela signifie que votre script devra s'exécuter en tant que root.

3
Brian Showalter

Votre commentaire suggère que vous essayez d'appeler cela à partir d'un langage de programmation. Si tel est le cas, votre programme peut-il générer un processus enfant qui appelle sleep alors le travail?

Que diriez-vous d'avoir votre programme calculer le nombre de secondes jusqu'à l'exécution souhaitée, et demandez-lui d'appeler Shell_exec("sleep ${secondsToWait) ; myCommandToRun");

1
dj_segfault

at est la bonne façon.

Si vous n'avez pas la commande at dans la machine et que vous n'avez pas non plus de privilèges d'installation dessus, vous pouvez mettre quelque chose comme ça sur cron (peut-être avec la crontab commande):

* * * 5 * /path/to/comand_to_execute; /usr/bin/crontab -l | /usr/bin/grep -iv command_to_execute | /usr/bin/crontab - 

il exécutera votre commande une fois et la supprimera de cron après cela.

0
alexandre1985