Сценарии во время загрузки 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).

Две части информации очень помогут найти ответ:

  1. Почему вы не можете настроить, когда скрипт запускается?
  2. Какие конкретные услуги / возможности должны быть готовы / работают, чтобы ваша задача была успешной? ИКС? сети? низкая нагрузка на систему? Общий файл монтируется? Каждая из этих вещей может быть проверена; "система загружена" является слишком общей и может включать в себя любой или все из них.

Вот (действительно уродливое) решение:

  1. используйте этот тест в скрипте:

    while [ ! -e "/etc/yes-we-up" ]; do
        sleep 10
    done
    
  2. добавить это в конец /etc/rc.local:

    touch /etc/yes-we-up && chmod 644 /etc/yes-we-up
    
  3. Создайте /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

Другие вопросы по тегам