Добавить строки в cron из скрипта

40

Есть ли способ добавить строки в cron пользователя через скрипт?

Я обычно делаю это с использованием crontab -e, но я хотел бы автоматизировать эту задачу с помощью сценария оболочки.

Адам Матан
источник
stackoverflow.com/questions/878600/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

49

Вы можете отобразить строку в нижней части текущего файла crontab следующим образом:

#!/bin/bash

line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
Ричард Холлоуэй
источник
+1 потому что вы меня опередили (у меня была ошибка скрипта при тестировании: D). Я думаю, что нужно добавить одну вещь: система должна быть проинформирована о том, что она cronбыла изменена.
Rinzwind
Я знал, что это будет гонка, чтобы получить ответ! Вы правы в том, что cron действительно должен быть уведомлен. Вот почему вы не можете просто повторить команду до конца crontab. Я проверил, что приведенный выше скрипт работает, и cron запускает команду.
Ричард Холлоуэй
13
Ох, и я думаю, что это также ошибки, если crontabдля этого пользователя еще не существует (?)
Rinzwind
7
Он предупреждает вас, что пользовательский crontab не существует, если это так, но затем он его создаст. Я оцениваю ваши комментарии как проницательные.
Ричард Холлоуэй
3

Если вы хотите отредактировать значение в вашем crontab, вы можете сделать что-то вроде:

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

Очевидно, что вы должны быть осторожны с заменой, чтобы убедиться, что она соответствует только той строке, которую вы хотите изменить; в противном случае все foosизменится на bars(в этом примере).

Преимущество этого метода в том, что вы не заменяете весь crontab. (Метафорический пинцет, а не кувалда.)

Вы можете использовать любую команду редактирования вместо sed . Например, если вы хотите использовать ed, чтобы подправить строку, которая выглядит примерно так:

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

Скажем, эта строка входит в число многих строк, или у вас есть много разных crontab для обновления в разных системах, и вы знаете, что ваша строка будет единственной строкой с термином flitchв ней.

Это может выглядеть так:

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

Теперь я должен признать , что почти 100% времени SED будет делать то , что ад будет делать, но это всегда хорошо иметь дополнительный инструмент на швейцарский армейский нож. ^. ^

fbicknel
источник