Назад | Перейти на главную страницу

Можно ли настроить cron (в Linux) для чтения пользовательского crontab из файла, зарегистрированного в приложении?

Мне нужен набор ежечасных, ежедневных и еженедельных файлов, таких как / etc /, но для каждого приложения, которое я запускаю.

Я бы в идеале хотел, чтобы cron заглянул в

/srv/www/*/current/config/cron для них.

Так что я могу добавить новое приложение Rails в / srv / www и заставить cron подбирать новые задания при следующем запуске.

Это желаемое за действительное?

Пусть cron будет выполнять вспомогательную программу ежечасно, ежедневно и т. Д., И пусть эта программа определяет, есть ли работа, которую нужно выполнить.

Вы пытаетесь создать эквивалент каталогов cron.hourly, cron.daily, cron.weekly и cron.monthly со скриптами в них для каждого приложения rails? Если это так, исходя из того, что сказал Джон, если бы вы добавили следующее в свой / etc / crontab, вы бы получили желаемый результат:

01 * * * * root for i in /srv/www/*/current/config/cron.hourly ; do run-parts "$i" > /dev/null 2>&1 ; done
02 4 * * * root for i in /srv/www/*/current/config/cron.daily ; do run-parts "$i" > /dev/null 2>&1 ; done
22 4 * * 0 root for i in /srv/www/*/current/config/cron.weekly ; do run-parts "$i" > /dev/null 2>&1 ; done
42 4 1 * * root for i in /srv/www/*/current/config/cron.monthly ; do run-parts "$i" > /dev/null 2>&1 ; done

Затем каждое приложение может просто указать необходимое подмножество каталогов cron.X и заполнить его соответствующими сценариями.

Однако, если вы хотите иметь только необязательный сценарий для каждой частоты для каждого приложения, вам нужно сделать что-то вроде:

01 * * * * root for i in /srv/www/*/current/config/cron.hourly ; do [ -x "$i" ] && "$i" ; done
02 4 * * * root for i in /srv/www/*/current/config/cron.daily ; do [ -x "$i" ] && "$i" ; done
22 4 * * 0 root for i in /srv/www/*/current/config/cron.weekly ; do [ -x "$i" ] && "$i" ; done
42 4 1 * * root for i in /srv/www/*/current/config/cron.monthly ; do [ -x "$i" ] && "$i" ; done

Опять же, это будет работать только для приложений, которые их указали.

Один из них, что вы ищете?

Типичный crontab будет содержать такие записи, как

# run-parts
01 * * * * root run-parts /etc/cron.hourly > /dev/null 2>&1
02 4 * * * root run-parts /etc/cron.daily > /dev/null 2>&1
22 4 * * 0 root run-parts /etc/cron.weekly > /dev/null 2>&1
42 4 1 * * root run-parts /etc/cron.monthly > /dev/null 2>&1

Я не эксперт, но не вижу причин, по которым вы не можете добавить туда другие каталоги таким же образом. Если вы хотите, чтобы это было более автоматическим, вы можете периодически запускать скрипт для поиска каталогов cron. *, Начиная с выбранного вами корня, и программно добавлять эти пути в / etc / crontab, если они там еще не существуют.

Сначала создайте сценарий Bash следующим образом:

#!/bin/bash
for web_job in /srv/www/*/current/config/cron/*;
 do [ -x $web_job  ] && $web_job || : ;
done

Сохраните его как-нибудь вроде /srv/www/run_web_jobs.sh. Затем добавьте его как задание cron. Например, чтобы он запускался ежедневно (должен быть root):

$ ln -s /etc/cron.daily/ /srv/www/run_web_jobs.sh

Или добавьте его в crontab пользователя.

$ crontab -e