Question Comment créer une tâche cron en utilisant automatiquement Bash 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 créer un cronjob à partir d'un script Bash?


282
2018-05-18 16:37


origine


Réponses:


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)

La source nixCraft.


402
2018-05-18 16:47



Vous pourrez peut-être le faire à la volée

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

crontab -l répertorie les tâches crontab actuelles, 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 une nouvelle crontab -l.


243
2018-05-18 18:02



Cette version plus courte ne nécessite aucun fichier temporaire, elle est insensible aux insertions multiples et vous permet de modifier la planification d'une entrée existante.

Disons que vous avez:

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 l'enlever de la crontab quel que soit son emploi du temps actuel:

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

Remarques:

  • grep -F correspond littéralement à la chaîne, car nous ne voulons pas l'interpréter comme une expression régulière
  • Nous ignorons également la planification du temps et ne recherchons que la commande. Par ici; l'horaire peut être modifié sans risque d'ajouter une nouvelle ligne à la crontab

53
2017-07-31 16:05



Merci à tous pour votre aide. En assemblant 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 ne pouvais pas comprendre comment éliminer le besoin 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 de planification. J'ai eu besoin des deux variables séparément dans la ligne de code qui fait le travail.

Détails

  1. Crédit au duckyflip, j'utilise ce petit truc de redirection (<(*command*)) pour tourner la sortie de crontab -l en entrée pour le fgrep commander.
  2. fgrep puis filtre tous les matchs de $command (-v option), insensible à la casse-i option).
  3. Encore une fois, le petit truc de redirection (<(*command*)) est utilisé pour remettre le résultat en entrée pour le cat commander.
  4. le cat commande reçoit également echo "$job" (auto explicatif), encore une fois, grâce à l'utilisation du redirecty thingy (<(*command*)).
  5. Donc, la sortie filtrée de crontab -l et le simple echo "$job", combinés, sont acheminés ('|') vers crontab - pour finalement être écrit.
  6. Et ils ont tous vécu heureux pour toujours!

En un mot:

Cette ligne de code filtre tous les travaux cron qui correspondent à la commande, puis écrit les travaux cron restants avec le nouveau, agissant efficacement comme une fonction "ajouter" ou "mettre à jour". Pour l'utiliser, il suffit de remplacer les valeurs de la command et job variables


37
2017-11-12 18:08



EDIT (écrasement fixe):

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

23
2018-05-18 16:49



Il y a eu beaucoup de bonnes réponses concernant l'utilisation de crontab, mais aucune mention d'une méthode plus simple, comme l'utilisation de cron.

En utilisant cron tirer parti des fichiers système et des répertoires situés à /etc/crontab, /etc/cron.daily,weekly,hourly ou /etc/cron.d/:

cat > /etc/cron.d/<job> << EOF
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root HOME=/  
01 * * * * <user> <command>
EOF

Dans l'exemple ci-dessus, nous avons créé un fichier dans /etc/cron.d/, fourni les variables d'environnement pour que la commande s'exécute avec succès, et à condition que userpour la commande, et le command lui-même. Ce fichier ne doit pas être exécutable et le nom ne doit contenir que des caractères alphanumériques et des traits d'union (plus de détails ci-dessous).

Pour donner une réponse approfondie cependant, regardons les différences entre crontab contre cron/crond:

crontab -- maintain tables for driving cron for individual users

Pour ceux qui veulent exécuter le travail dans le contexte de leur utilisateur sur le système, en utilisant crontab peut faire parfaitement sens.

cron -- daemon to execute scheduled commands

Pour ceux qui utilisent la gestion de configuration ou veulent gérer des travaux pour d'autres utilisateurs, auquel cas nous devrions utiliser cron.

Un extrait rapide des pages de manuel vous donne quelques exemples de ce qu'il faut faire et ne pas faire:

/ etc / crontab et les fichiers dans /etc/cron.d doivent appartenir à root, et ne doivent pas être en écriture de groupe ou autre. Contrairement à la zone de spoule, les fichiers sous /etc/cron.d ou les fichiers sous /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly et /etc/cron.monthly peuvent également être liens symboliques, à condition que le lien symbolique et le fichier vers lequel il pointe appartiennent à root. Les fichiers sous /etc/cron.d n'ont pas besoin d'être exécutables, alors que les fichiers sous /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly et /etc/cron.monthly ils sont exécutés par des parties d'exécution (voir run-parts (8) pour plus d'informations).

La source:  http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

La gestion de crons de cette manière est plus facile et plus évolutive du point de vue du système, mais ne sera pas toujours la meilleure solution.


6
2018-03-13 21:46



Il y a des chances que vous automatisiez cela et que vous ne souhaitiez pas qu'un seul travail soit ajouté deux fois. Dans ce cas, utilisez:

CRON="1 2 3 4 5 /root/bin/backup.sh"
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")

Cela ne fonctionne que si vous utilisez BASH. Je ne connais pas le bon DASH (sh) la syntaxe.


5
2017-07-19 09:24



Une variante qui édite uniquement crontab si la chaîne souhaitée n'y est pas trouvée:

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")

5
2017-11-21 10:21



Pour une création / remplacement rapide et sale d'un crontab à partir d'un script BASH, j'ai utilisé cette notation:

crontab <<EOF
00 09 * * 1-5 echo hello
EOF

3
2018-05-29 17:02