Сценарии во время загрузки Linux: как проверить, завершена ли загрузка?
У меня есть скрипт, который запускается во время загрузки на сервере 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 или что-то еще).
9 ответов
Действительно лучший способ сделать то, что вы хотите, это вставить вызов скрипта в нужное место в init SysV. Я бы порекомендовал вам написать скрипт, который вызывает ваш скрипт, и уговаривать вашего системного администратора, пока он или она не установит его в нужном месте.
РЕДАКТИРОВАТЬ: Хорошо, я только что прочитал ваш второй вопрос, и я вижу, что вы говорите о сценарии, который запускается асинхронно, когда кто-то подключает устройство. То, что вы хотите сделать, это проверить уровень запуска, чтобы увидеть, равен ли он 2 (или каков ваш уровень запуска по умолчанию, если вы изменили его, а также 1, если вы хотите, чтобы он работал в однопользовательском режиме.) Если я читаю Часто задаваемые вопросы о Debian, уровень запуска не меняется на значение по умолчанию до завершения загрузки.
Я бы посмотрел начальные уровни.
Это должно помочь вам начать..
[[ `/sbin/runlevel | cut -d " " -f 2` == 5 ]] && echo "Ready"
НТН
В системе debian вы можете указать порядок запуска чего-либо во время загрузки по номеру в начале скрипта в /etc/rc?.d. Таким образом, первый сценарий, запускаемый на этом уровне выполнения, будет /etc/rc?.d/S01scriptname, а последним будет /etc/rc?.d/S99scriptname. Убедившись, что ваш сценарий является единственным с префиксом S99, он будет работать последним.
В качестве альтернативы, последнее, что нужно сделать, это вызвать /etc/rc.local. Вызвав свой скрипт оттуда, вы можете убедиться, что он вызывается в конце процесса загрузки.
Другой вариант - проверить файл / etc / nologin, который создается в начале загрузки и удаляется в конце.
Это сказанное - я не думаю, что ваша идея проверить, работал ли сценарий, является плохой. Это гарантирует, что ничто иное не помешает правильной работе скрипта.
Вы можете добавить скрипт под rc3.d. Назовите его S99local, и он запустится после всех других скриптов.
Сценарии выполняются в порядке от S01xx до S99xx.
Вы также можете запустить его как cronjob, используя @reboot как время.
Вы предполагаете, что вам нужно проверить, готова ли система, но что это значит? Какие функциональные возможности вам требуются для запуска этого скрипта? Сеть должна быть в рабочем состоянии? Должен ли X11 иметь зарегистрированного пользователя? Проверьте эти условия напрямую или найдите лучшее место для установки сценария, который будет выполняться после выполнения этих конкретных шагов (например, раздел постап в /etc/network/interfaces или similiar).
Две части информации очень помогут найти ответ:
- Почему вы не можете настроить, когда скрипт запускается?
- Какие конкретные услуги / возможности должны быть готовы / работают, чтобы ваша задача была успешной? ИКС? сети? низкая нагрузка на систему? Общий файл монтируется? Каждая из этих вещей может быть проверена; "система загружена" является слишком общей и может включать в себя любой или все из них.
Вот (действительно уродливое) решение:
используйте этот тест в скрипте:
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
Последний файл, который вызывается в процессе загрузки, - это файл /etc/rc.local. Все, что вы поместите в этот файл, будет запущено в конце процесса загрузки.
Одним из примеров руководства для этого является http://www.netbsd.org/docs/guide/en/chap-rc.html