549 votes

Comment créer une tâche cron en utilisant Bash automatiquement sans l'éditeur interactif ?

Est-ce que crontab a un argument pour créer des tâches cron sans utiliser l'éditeur (crontab -e). Si oui, quel serait le code pour créer un cronjob à partir d'un script Bash ?

0 votes

14 votes

Malheureusement, la plupart des meilleures réponses ici montrent simplement comment modifier la crontab - bien que de manière raisonnablement sûre - mais je pense que c'est globalement la mauvaise approche. La meilleure, la plus sûre et la plus simple est de déposer un fichier dans {{cron.d}}, et il y a (actuellement) des réponses peu votées qui expliquent comment le faire si vous regardez plus bas.

0 votes

@gregmac, merci. Je crois que le mien ressemble à ce commentaire... j'ai essayé d'expliquer ce qui se passait et où ça pouvait vivre.

742voto

dogbane Points 85749

Vous pouvez ajouter à la crontab comme suit :

#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron

Explication de la ligne Cron

* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Source : nixCraft .

19 votes

Vous devez utiliser tempfile ou mktemp.

0 votes

@dogbane j'ai un doute. Pourquoi "rm mycron" est utilisé ici ??

0 votes

mycron est un fichier temporaire utilisé pour stocker le contenu de la crontab. Vous pouvez l'appeler comme bon vous semble.

413voto

TheBonsai Points 3112

Vous pouvez le faire à la volée.

crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -

crontab -l liste les travaux crontab en cours, cat l'imprime, echo imprime la nouvelle commande et crontab - ajoute tous les trucs imprimés dans le fichier crontab. Vous pouvez voir l'effet en faisant un nouveau crontab -l .

3 votes

Merci, pouvez-vous expliquer la syntaxe, ou pointer vers une url qui l'explique ?

10 votes

crontab -l liste les travaux crontab en cours, cat l'imprime, echo imprime la nouvelle commande et crontab - ajoute tous les éléments imprimés dans le fichier crontab. Vous pouvez voir l'effet en faisant un nouveau crontab -l

9 votes

Ça marche très bien pour moi. Si l'utilisateur n'a pas de crontab existante, vous verrez no crontab for <username> mais ça marche quand même.

118voto

MoonCactus Points 71

Ce dernier, plus court, ne nécessite pas de fichier temporaire, il est immunisé contre les insertions multiples et vous permet de modifier le calendrier d'une entrée existante.

Disons que vous avez ça :

croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"

Pour l'ajouter à la crontab, sans duplication :

( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -

Pour le supprimer de la crontab quel que soit son horaire actuel :

( crontab -l | grep -v -F "$croncmd" ) | crontab -

Notes :

  • grep -F correspond à la chaîne littéralement, car nous ne voulons pas l'interpréter comme une expression régulière.
  • Nous ignorons également la programmation temporelle et ne cherchons que la commande. De cette façon, l'horaire peut être modifié sans risquer d'ajouter une nouvelle ligne dans la crontab.

0 votes

@moeseth : pouvez-vous développer ?

0 votes

Vous devriez l'essayer sur votre ordinateur

2 votes

@moeseth:J'ai évidemment essayé sur mon ordinateur (linux). Je ne voudrais pas suggérer des trucs aléatoires qui ne fonctionnent pas :/.

45voto

stoutie Points 301

Merci à tous pour votre aide. En rassemblant ce que j'ai trouvé ici et ailleurs, j'ai trouvé ceci :

Le code

command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -

Je n'arrivais pas à trouver comment éliminer la nécessité des deux variables sans me répéter.

command est évidemment la commande que je veux programmer. job prend $command et ajoute les données d'ordonnancement. J'avais besoin des deux variables séparément dans la ligne de code qui effectue le travail.

Détails

  1. Crédit à duckyflip, j'utilise ce petit truc de redirection ( <(*command*) ) pour transformer la sortie de crontab -l en entrée pour le fgrep commandement.
  2. fgrep puis filtre toutes les correspondances de $command ( -v ), insensible à la casse (option -i option).
  3. Encore une fois, le petit truc de redirection ( <(*command*) ) est utilisé pour transformer le résultat en entrée pour la fonction cat commandement.
  4. El cat La commande reçoit également echo "$job" (auto-explicatif), encore une fois, grâce à l'utilisation du truc de redirection ( <(*command*) ).
  5. Ainsi, la sortie filtrée de crontab -l et le simple echo "$job" combinés, sont envoyés ('|') vers crontab - pour être enfin écrit.
  6. Et ils vécurent tous heureux jusqu'à la fin des temps !

En un mot :

Cette ligne de code filtre toutes les tâches cron qui correspondent à la commande, puis écrit les tâches cron restantes avec la nouvelle, agissant efficacement comme une fonction "ajouter" ou "mettre à jour". Pour utiliser cette fonction, il suffit d'intervertir les valeurs de l'attribut command y job variables.

5 votes

Pour le bénéfice des autres lecteurs, l'avantage de cette approche est que vous pouvez l'exécuter plusieurs fois sans vous soucier des entrées en double dans la crontab (contrairement à toutes les autres solutions). C'est grâce à la fonction fgrep -v

5 votes

Si vous préférez la méthode traditionnelle de tuyauterie de gauche à droite, remplacez la dernière ligne par : crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l

1 votes

@AntoineLizée, votre réponse a un "l" supplémentaire à la fin, qui ne devrait pas être là.

33voto

duckyflip Points 6895

EDIT (correction de l'écrasement) :

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -

0 votes

Cela remplacera le contenu de la crontab

1 votes

@TheBonsai oh je vois, je l'ai corrigé maintenant pour que la nouvelle commande APPLIQUE le contenu de la crontab existante.

3 votes

Gardez à l'esprit que la substitution de processus de Bash avale les erreurs. Si crontab -l échoue, mais crontab - Si vous réussissez, votre crontab sera une ligne unique.

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