Comment exécuter une tâche cron une seule fois?

14

J'ai un travail qui court pour toujours au moment où il commence. Je veux donc le démarrer une seule fois après l'avoir entré dans le fichier "crontab -e" et l'avoir enregistré (ou) à chaque redémarrage.

Comment y parvenir?

Rama Vadakattu
la source

Réponses:

22

Si vous souhaitez exécuter une commande une fois à une date ultérieure, utilisez la atcommande.

Si vous souhaitez qu'une commande soit exécutée une seule fois au démarrage du système, la solution correcte consiste à utiliser soit:

  • scripts RC système (/etc/rc.local)
  • crontab avec le @rebootpréfixe spécial (voir la page de manuel)

Ce dernier est la seule option pour un utilisateur non root.

MikeyB
la source
2
+1 pour avoir mentionné @reboot.
Alex Holst
Je préférerais toujours utiliser /etc/rc.local si possible ... Je soupçonne que @reboot exécute réellement des commandes au démarrage de crond, pas au démarrage du système. Différence subtile mais possible.
MikeyB
supposons que j'ai entré @reboot "cmd ............." dans le fichier crontab et l'ai enregistré. Cette commande va-t-elle démarrer maintenant? (ou) Ne démarre-t-il qu'après redémarrage?
Rama Vadakattu
Essayez-le et voyez :) Ce que vous devrez probablement faire est de le mettre dans crontab, puis de planifier une exécution immédiate à l'aide deat now
MikeyB
Bonne réponse. J'oublie toujours @reboot.
Bill Weiss
9

Vous pouvez utiliser at (1) pour exécuter un travail à un moment donné dans le futur. Cependant, si vous voulez exécuter quelque chose au démarrage et qu'il continuera de fonctionner seul, peut-être voulez-vous une entrée dans /etc/init.d/ pour cela? Cela vous permettrait de le démarrer au démarrage.

Bill Weiss
la source
1
Vous pouvez également utiliser rc.local. Les commandes dans /etc/rc.local "seront exécutées après tous les autres scripts d'initialisation. Vous pouvez mettre vos propres trucs d'initialisation dans rc.local si vous ne voulez pas faire le truc d'initialisation complet du style Sys V."
Joe
Joe: bon appel.
Bill Weiss
Comment arrêter le processus qui a commencé par à la commande? (Je sais tuer l'ID de processus après avoir vu la liste des ID de processus en utilisant la "commande ps", cela fonctionne-t-il également pour "à la commande"). La création de scripts personnalisés est-elle facile?
Rama Vadakattu
Oui aux deux. Tous les processus peuvent être arrêtés à l'aide kill(en supposant que vous avez les autorisations pour le faire, ce que vous faites pour vos propres processus). Faire un script d'init est vraiment facile. Cherchez /etc/init.d/un script qui n'est pas très long et modélisez le vôtre ou google making init scripts (your distribution).
Bill Weiss
1
De nombreuses distributions comprennent un script squelette ( /etc/init.d/skeletonsur openSuSE) que vous pouvez adapter à votre usage.
MikeyB
3

Un travail qui ne s'exécute qu'une seule fois et s'exécute indéfiniment jusqu'à ce que vous lui disiez de mourir est appelé "démon". Ils sont normalement démarrés via des scripts d'initialisation dans /etc/init.d/.

Si votre travail se termine à un moment donné et peut être considéré comme un type de travail ponctuel, vous pouvez alors consulter la commande at. Par exemple, si je voulais exécuter la commande find à 22 heures ce soir et seulement une fois, je ferais:

$ at 10PM
at> find /root > /root/find_results.list
at> <EOT>
job 3 at 2010-02-10 22:00
Carpe Noctem
la source
1

Jetez un œil à la commande at

Dominik
la source
que se passera-t-il lorsque les systèmes seront redémarrés? Dois-je à nouveau saisir "à la commande"?
Rama Vadakattu
Les entrées de commande at ne seront pas perdues lors des redémarrages. ibm.com/developerworks/linux/library/l-job-scheduling.html est une introduction intéressante à la planification des tâches
Dominik
@Rama Vadakattu: "Les entrées de commande at ne seront pas perdues lors des redémarrages." ... qui n'ont pas encore été exécutés. Voir la réponse de MikeyB .
pause jusqu'à nouvel ordre.
ok je ferai plus de recherche à ce sujet.
Rama Vadakattu