Adicionar linhas ao cron a partir do script

40

Existe uma maneira de adicionar linhas ao cron de um usuário via script?

Geralmente faço isso usando crontab -e, mas gostaria de automatizar essa tarefa com um script de shell.

Adam Matan
fonte
stackoverflow.com/questions/878600/…
Ciro Santilli escreveu:

Respostas:

49

Você pode fazer eco da linha na parte inferior do crontab de usuários atuais assim:

#!/bin/bash

line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
Richard Holloway
fonte
+1 porque você me venceu (tive um erro de script durante o teste: D). Uma coisa que você precisa adicionar, penso: o sistema precisa ser informado de que cronfoi alterado.
Rinzwind
Eu sabia que seria uma corrida para ser respondida! Você está certo de que o cron precisa ser notificado. É por isso que você não pode simplesmente repetir o comando até o final do crontab. Eu testei que o script acima funciona e o cron começa a executar o comando.
Richard Holloway
13
Ah, e eu acho que isso também erros se crontabpara esse usuário não existe ainda (?)
Rinzwind
7
Ele avisa que o usuário crontab não existe, se for esse o caso, mas será criado. Estou votando seus comentários como perspicazes.
Richard Holloway
3

Se você deseja editar um valor no seu crontab, pode fazer algo como:

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

Obviamente, você precisa ter cuidado com sua substituição para garantir que ela corresponda apenas à (s) linha (s) que deseja alterar; caso contrário, todos foosserão alterados para bars(neste exemplo).

A vantagem desse método é que você não está substituindo o crontab inteiro. (Uma pinça metafórica em vez de uma marreta.)

Você pode usar qualquer comando de edição em vez de sed . Por exemplo, se você deseja usar ed para retocar uma linha que começa assim:

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

Digamos que essa linha esteja entre muitas linhas ou você tenha muitos crontabs diferentes para atualizar em sistemas diferentes e você sabe apenas que sua linha será a única linha com o termo flitchnela.

Pode parecer com:

$ 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
...

Agora devo admitir que quase 100% do tempo sed irá fazer o que ed vai fazer, mas é sempre bom ter uma ferramenta extra sobre o canivete suíço. ^. ^

fbicknel
fonte