Неправильно ли для сценария запуска системы (/etc/rc) сам фон?
[Не уверен, что этот вопрос принадлежит здесь. Если вы чувствуете, что на суперпользователе было бы лучше, не стесняйтесь так говорить.]
У меня есть загрузочный скрипт в /etc/init.d
(с соответствующими символическими ссылками в /etc/rc#.d
) который хочет выполнить большую часть своей работы позже - через несколько минут после загрузки. Очевидно, я не хочу, чтобы загрузка остальной части системы была отложена на эти несколько минут.
Так что я заставляю сценарий поместить часть себя на задний план, а затем подожду, пока не настанет время сделать все остальное. Но насколько init
обеспокоен тем, что не фоновая часть скрипта вернулась успешно, что означает, что остальная часть нормальной загрузки системы может продолжаться.
Между тем, фоновая часть скрипта выполняет некоторую комбинацию (а) сна и (б) ожидания условий, которые позволят ему продолжить работу. (Для целей этого вопроса, допустим, эти условия не имеют значения. Достаточно сказать, что я бы хотел, чтобы система в основном работала, даже если эти условия не были выполнены, и что обработка зависит от этих условий. условия, действительно, готовы ждать.)
Но мне трудно заставить фоновую часть этого работать. Простой сон - это хорошо, но некоторые из немного более изощренных обработок, которые я выполняю, то есть для проверки этих условий, ведут себя довольно таинственно. Это похоже на проблемы, которые возникают у вас, когда вы пытаетесь взять обычный сценарий пользовательского уровня и превратить его в загрузочный скрипт, только он не работает, потому что его среда настолько отличается, чем когда он был потомком обычного интерактивного сценария. Логин пользователя.
Чтобы быть более конкретным, вот схема сценария, который я использовал:
do_the_work () {
# wait (in the background) 4 mins, then finish
(
sleep 240
echo "did it" `date` > /tmp/didit
... do other stuff ...
) &
echo "Started background script"
}
case "$1" in
start)
do_the_work
;;
stop)
:
;;
esac
exit 0
Мой вопрос на данный момент прост: работает ли что-то в фоновом режиме, как это, в результате сценария init.d rc, плохая идея? Альтернативой может быть задание cron, которое запускается (скажем) раз в минуту и имеет некоторую логику, чтобы обнаружить случай, когда (а) прошло N минут с момента загрузки и (b) были выполнены необходимые условия, но (c) задание cron еще не сделал свое дело (и, конечно, что предыдущий вызов работы cron не был в процессе). Это будет иметь несколько дополнительных затрат, но я полагаю, я мог бы жить с ними.