У меня есть сценарий, который запускается во время загрузки на сервере Debian. Он запускается слишком рано, но я не могу контролировать, когда он выстрелит. Я могу заставить скрипт отложить собственный запуск с помощью:
sleep 60
... или, как вариант, я мог бы просто попробовать действие несколько раз, например:
TESTRUN=0
ACTIONWORKED=0
while [ $ACTIONWORKED -eq 0 ] && [ $TESTRUN -le 5 ]; do
# run the action i want
# quick test if it worked
# if yes, set ACTIONWORKED=1
# if no, sleep 10
# increment TESTRUN
done
Как лучше проверить готовность системы? Скрипт будет запускаться в другое время во время работы системы, поэтому тест необходим, чтобы различать "загрузка-не могу-сделать-это-еще" и "не-загружаться-запустить-сейчас" состояния. Я не хочу, чтобы он ждал каждый раз, когда запускается скрипт.
Редактировать: Спасибо за идеи. Продолжайте писать, если у вас есть альтернативы тому, что уже было опубликовано.
Тем, кто спрашивал о подробностях, я оставил их вне вопроса, чтобы собрать ответы, которые работают с общим процессом загрузки Linux.
Предположим, что «полностью загруженная» система представила приглашение входа в систему (через консоль, X или что-то еще).
Я бы смотрел уровни инициализации.
Это должно помочь вам начать ...
[[ `/sbin/runlevel | cut -d " " -f 2` == 5 ]] && echo "Ready"
HTH
В системе debian вы можете указать порядок запуска чего-либо во время загрузки по номеру в начале сценария в /etc/rc?.d. Таким образом, первый сценарий, запускаемый на этом уровне запуска, будет /etc/rc?.d/S01scriptname, а последний - /etc/rc?.d/S99scriptname. Убедившись, что ваш сценарий является только один с префиксом S99, это гарантирует, что он будет запущен последним.
В качестве альтернативы, одно из последних действий, которые нужно сделать, - это позвонить /etc/rc.local. Вызвав свой скрипт оттуда, вы можете убедиться, что он вызывается в конце процесса загрузки.
Другой вариант - тест на файл / etc / nologin - который создается в начале загрузки и удаляется в конце.
При этом - я не думаю, что ваша идея проверить, работает ли сценарий или нет, плохая. Это гарантирует, что ничто другое не помешает правильной работе скрипта.
На самом деле лучший способ сделать то, что вы хотите, - это вставить вызов сценария в нужное место в SysV init. Я бы порекомендовал вам написать сценарий, который вызывает ваш сценарий, и упрашивать системного администратора, пока он или она не установит его в нужное место.
EDIT: Хорошо, я только что прочитал ваш другой вопрос, и я вижу, что вы говорите о скрипте, который запускается асинхронно, когда кто-то подключает устройство. Что вы хотите сделать, так это проверить уровень запуска, чтобы узнать, равен ли он 2 (или любому другому уровню запуска по умолчанию, если вы его изменили, а также 1, если вы хотите, чтобы это работало в однопользовательском режиме). Если я читаю Debian FAQ правильно, уровень выполнения не меняется на значение по умолчанию до завершения загрузки.
Вы можете добавить сценарий в rc3.d. Назовите его S99local, и он запустится после всех остальных скриптов.
Сценарии выполняются в порядке от S01xx до S99xx.
Вы также можете запустить его как задание cron, используя @reboot в качестве времени.
Вы предполагаете, что вам нужно проверить, готова ли система, но что это значит? Какие функции вам требуются для запуска этого скрипта? Должна ли сеть быть в рабочем состоянии? Должен ли X11 иметь зарегистрированного пользователя? Проверьте эти условия напрямую или найдите лучшее место для установки сценария, который будет выполняться, когда эти конкретные шаги будут завершены (например, строфа postup в / etc / network / interfaces или аналогично).
Две части информации очень помогут найти ответ:
Последний файл, который вызывается в процессе загрузки, - это файл /etc/rc.local. Все, что вы поместите в этот файл, будет запущено в конце процесса загрузки.
Один из примеров руководства для этого: http://www.netbsd.org/docs/guide/en/chap-rc.html
Вот (действительно уродливый) решение:
используйте этот тест в скрипте:
while [ ! -e "/etc/yes-we-up" ]; do
sleep 10
done
добавьте это в конец /etc/rc.local
:
touch /etc/yes-we-up && chmod 644 /etc/yes-we-up
Создайте /etc/init.d/is-we-up
,
символическая ссылка на /etc/rc0.d/K02is-we-up
и /etc/rc6.d/K02is-we-up
,
и вставьте это:
#!/bin/sh -e
# no we ain't
rm /etc/yes-we-up