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
?
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.
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]
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"!
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.
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");
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.