Agregar líneas a cron desde el script

40

¿Hay alguna manera de agregar líneas al cron de un usuario a través de un script?

Normalmente lo hago usando crontab -e, pero me gustaría automatizar esta tarea con un script de shell.

Adam Matan
fuente
stackoverflow.com/questions/878600/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

49

Puede hacer eco de la línea en la parte inferior del crontab de usuarios actuales de esta manera:

#!/bin/bash

line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
Richard Holloway
fuente
+1 porque me ganaste (tuve un error de script durante la prueba: D). Creo que hay que agregar 1 cosa: el sistema necesita ser informado de que cronse modificó.
Rinzwind
¡Sabía que esta sería una carrera para obtener respuesta! Tienes razón en que cron necesita ser notificado. Esta es la razón por la que no puedes simplemente hacer eco del comando al final del crontab. He probado que el script anterior funciona y cron comienza a ejecutar el comando.
Richard Holloway
13
Ah, y creo que esto también se equivoca si crontabese usuario aún no existe (?)
Rinzwind
77
Le advierte que los usuarios crontab no existe, si ese es el caso, pero luego lo creará. Estoy votando sus comentarios como perspicaces.
Richard Holloway
3

Si desea editar un valor en su crontab, puede hacer algo como:

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

Obviamente, debe tener cuidado con su sustitución para asegurarse de que solo coincida con la (s) línea (s) que desea cambiar; de lo contrario, todos foosse cambian a bars(en este ejemplo).

La ventaja de este método es que no está reemplazando todo el crontab. (Una pinza metafórica en lugar de un mazo).

Puede usar cualquier comando de edición en lugar de sed . Por ejemplo, si desea utilizar ed para retocar una línea que comienza así:

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

Digamos que esta línea se encuentra entre muchas líneas o tiene muchas crontabs diferentes para actualizar en diferentes sistemas y solo sabe que su línea será la única línea con el término flitchen ella.

Podría verse así:

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

Ahora debo admitir que casi el 100% del tiempo sed hará lo que hará Ed , pero siempre es bueno tener una herramienta adicional en la navaja suiza. ^. ^

fbicknel
fuente