Ajouter des lignes à cron à partir du script

40

Est-il possible d'ajouter des lignes au cron d'un utilisateur via un script?

Je le fais habituellement en utilisant crontab -e, mais j'aimerais automatiser cette tâche avec un script shell.

Adam Matan
la source
stackoverflow.com/questions/878600/…
Ciro Santilli a annoncé le

Réponses:

49

Vous pouvez rappeler la ligne au bas de la crontab des utilisateurs actuels comme ceci:

#!/bin/bash

line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
Richard Holloway
la source
+1 parce que tu m'as battu (j'ai eu une erreur de script lors du test: D). Une chose que vous devez ajouter, je pense: le système doit être informé de ce qui a cronété changé.
Rinzwind
Je savais que ce serait une course pour obtenir une réponse! Vous avez raison, cron doit être averti. C'est pourquoi vous ne pouvez pas simplement renvoyer la commande à la fin de la crontab. J'ai testé que le script ci-dessus fonctionne et que cron commence à exécuter la commande.
Richard Holloway
13
Oh, et je pense que cela est également erroné si, crontabpour cet utilisateur, il n'existe pas encore (?)
Rinzwind
7
Il vous avertit que la crontab des utilisateurs n’existe pas, si tel est le cas, mais qu’elle le créera ensuite. Je vote vos commentaires comme perspicaces.
Richard Holloway
3

Si vous voulez éditer une valeur dans votre crontab, vous pouvez faire quelque chose dans les lignes suivantes:

$ crontab -l | sed -e 's/foo/bar/' | crontab -

Évidemment, vous devez faire attention à votre substitution pour vous assurer qu'elle correspond uniquement à la ou aux lignes que vous souhaitez modifier. sinon, tous foossont remplacés par bars(dans cet exemple).

L'avantage de cette méthode est que vous ne remplacez pas l'intégralité de la crontab. (Une pince métaphorique plutôt qu'un sledgehammer.)

Vous pouvez utiliser n’importe quelle commande d’édition au lieu de sed . Par exemple, si vous souhaitez utiliser ed pour retoucher une ligne qui commence par ressembler à ceci:

2 * * * * /sbin/flitch --days 3,4 > /var/log/flitch.out 2>&1

Supposons que cette ligne figure parmi de nombreuses lignes ou que vous ayez de nombreuses crontabs différentes à mettre à jour sur des systèmes différents et que vous savez seulement que votre ligne sera la seule ligne contenant le terme flitch.

Cela pourrait ressembler à:

$ cat /tmp/edscript
/flitch
s/3/9/
w
q
$ crontab -l > /tmp/out && ed /tmp/out < /tmp/edscript && crontab - < /tmp/out
$ crontab -l
...
2 * * 1 * /sbin/flitch --days 9,4 > /var/log/flitch.out 2>&1
...

Maintenant , je dois admettre que près de 100% du temps sed fera quoi ed fera, mais il est toujours bon d'avoir un outil supplémentaire sur le couteau suisse. ^. ^

fbicknel
la source