Обновление crontab из make-файла - PullRequest
1 голос
/ 06 октября 2009

Я пытаюсь обновить crontab из файла GNU Make. Идея такова: я просматриваю существующую таблицу cron и отфильтровываю все записи, помеченные как мои (через комментарий), и сохраняю их во временном файле. Затем я добавляю свои задания в этот временный файл и делаю его новой таблицей cron. Таким образом, make-файл может быть запущен несколько раз без ущерба для работы других людей.

Это соответствующая часть файла make:

crontab.tmp: $(CRON_FILES)
    @echo -n "Generating new cron table combining existing one with a new one ..."
    if $$(crontab -l); then crontab -l | grep -v "MAX-CRON-JOB"; fi > $@
    @cat $(CRON_FILES) | awk '{print $$0, " ## MAX-CRON-JOB"}' >> $@
    @echo "OK"

.PHONY: cronjobs
cronjobs: crontab.tmp
    @echo -n "Installing cron commands... "
    @crontab $<
    @echo "OK"

Беспокойная часть этой строки:

if $$(crontab -l); then crontab -l | grep -v "MAX-CRON-JOB"; fi > $@

Когда таблица cron пуста, она как-то ломает make, в то время как соответствующая сгенерированная команда bash:

if $(crontab -l); then crontab -l | grep -v "MAX-CRON-JOB"; fi > crontab.tmp

Работает нормально из командной строки.

Вот ошибка от make (ничего особенного, если вы спросите меня ...):

Generating new cron table combining existing one with a new one ...if $(crontab -l); then crontab -l | grep -v "MAX-CRON-JOB"; fi > crontab.tmp
make: *** [crontab.tmp] Error 1

Что мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 06 октября 2009

Почему вы «избегаете» crontab? Насколько я могу сказать,
if crontab -l; then crontab -l | grep -v "MAX-CRON-JOB"; fi > $@ 

должно работать нормально.

Зачем вообще использовать условное? Если таблица cron пуста, пусть будет так:
crontab.tmp: $(CRON_FILES) 
    @echo -n "Generating new cron table..."
    @crontab -l | grep -v "MAX-CRON-JOB" > $@ 
    @cat $(CRON_FILES) | awk '{print $$0, " ## MAX-CRON-JOB"}' >> $@ 
    @echo "OK"
1 голос
/ 06 октября 2009

Попробуйте изменить эту строку, чтобы включить тест (квадратные скобки):

if [ $$(crontab -l) ]; then crontab -l | grep -v "MAX-CRON-JOB"; fi > $@

потому что, по крайней мере для меня, это не работает без приглашения bash:

if $(crontab -l); then crontab -l | grep -v "MAX-CRON-JOB"; fi > $@

выходы:

-bash: 0: command not found
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...