79 votes

Comment configurer cron pour qu'il exécute un fichier une seule fois à un moment précis ?

Comment puis-je configurer cron pour exécuter un fichier une seule fois à un moment précis ? Une des alternatives est at mais il n'est pas accessible à tous les utilisateurs des plans d'hébergement standard. C'est pourquoi je me demandais s'il était possible de le faire à l'aide de cron ?

0 votes

J'ai essayé de lancer $at = shell_exec('at'); sur un serveur LAMP standard et il renvoie NULL. Je suppose donc qu'il ne fonctionne pas (qu'il n'a pas de droits) par défaut.

91voto

TomOnTime Points 407

Vous voulez vraiment utiliser at . Il est exactement conçu à cet effet.

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

Cependant, si vous n'avez pas at ou si votre hébergeur ne vous permet pas d'y accéder, vous pouvez inclure dans une tâche cron un code qui garantit qu'elle ne sera exécutée qu'une seule fois.

Mettez en place une entrée cron avec une heure très spécifique :

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

Ensuite, /home/adm/bin/the_command doit s'assurer qu'elle 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!' me@example.com

0 votes

Le + est pour "Vous voulez vraiment utiliser at. Il est exactement fait pour ça", parce que c'est tellement vrai... Je viens tout juste de le découvrir, alors pourquoi ne pas utiliser son propre CLI ? A moins que l'interaction actuelle ne soit peut-être ajoutée après 2015, auquel cas ma question n'est pas vraiment applicable....

2 votes

Vous n'avez pas à echo la commande en "at". C'est juste quelque chose que je fais parce qu'au final, j'automatise tout.

0 votes

Salut @Tomontime, je me demande si l'on peut déclencher un redémarrage comme ceci (sans cron), puisque cela nécessite sudo/Root - comme echo "reboot" | at now + 9 hour

46voto

gparis Points 1141

Essayez d'exécuter une commande le 30 mars 2011 à minuit :

0 0 30 3 ? 2011  /command

AVERTISSEMENT : Comme indiqué dans les commentaires, le année n'est pas prise en charge par les implémentations standard/par défaut de cron. Veuillez vous référer à Réponse de TomOnTime ci-dessous pour une manière correcte d'exécuter un script à un moment spécifique dans le futur dans les implémentations standards de cron.

0 votes

Ainsi, il ne s'exécutera qu'une seule fois ? enfin, apparemment. Cependant, existe-t-il un moyen de convertir l'horodatage au format de l'heure crong ?

0 votes

Vous devriez probablement omettre le champ "Jour de la semaine" en utilisant un point d'interrogation ( ?).

2 votes

De Wikipedia : fr.wikipedia.org/wiki/Cron#Personnages_spéciaux ... Le caractère " ?" est utilisé pour omettre la spécification d'une valeur pour les champs day-of-month et day-of-week. Étant donné qu'il n'est pas possible de spécifier des valeurs pour les deux champs, le caractère '?' devient nécessaire pour omettre l'une des deux valeurs ('*' est considéré comme une valeur spécifique).

31voto

TomOnTime Points 407

Vous voulez vraiment utiliser at . Il est exactement conçu à cet effet.

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

Cependant, si vous n'avez pas at ou si votre hébergeur n'y donne pas accès, vous pouvez créer une entrée cron qui s'efface d'elle-même.

Malheureusement, cela va supprimer toutes vos entrées cron. Cependant, si vous n'en avez qu'une, c'est parfait.

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 sera toujours exécuté.

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

6 votes

Note du modérateur : ceci n'est pas un repost de L'autre réponse de Tom ici il s'agit d'une réponse alternative utilisant une technique différente.

4voto

Brian Showalter Points 2026

Vous pouvez mettre un fichier crontab dans /etc/cron.d qui lancerait un script qui exécuterait votre commande et supprimerait ensuite le fichier crontab en /etc/cron.d . Bien sûr, cela signifie que votre script devra être exécuté en tant que Root.

1voto

Zaur Hajili Points 9

Pour ceux qui ne sont pas en mesure d'accéder/de s'installer at dans l'environnement, peut utiliser un script personnalisé :

#!/bin/bash
if [ $# -lt 2 ]; then
echo ""
echo "Syntax Error!"
echo "Usage: $0 <shell script> <datetime>"
echo "<datetime> format: %Y%m%d%H%M"
echo "Example: $0 /home/user/scripts/server_backup.sh 202008142350"
echo ""
exit 1
fi

while true; do
  t=$(date +%Y%m%d%H%M);      
  if [ $t -eq $2 ]; then
    /bin/bash $1
    echo DONE $(date);
    break;
  fi;
  sleep 1;
done

Nommons le script en tant que run1time.sh Un exemple pourrait être quelque chose comme :

nohup bash run1time.sh /path/to/your/script.sh 202008150300 &

0 votes

Cela ne semble pas répondre à la question.

0 votes

@NVS Abhilash c'est une véritable solution de contournement, une alternative à la commande at. La colonne année dans cron n'est pas supportée dans les implémentations standard/par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X