Запустить скрипт на уровне выполнения 1

Я пытаюсь запустить скрипт на уровне запуска 1 из /etc/inittab, Сценарий, который я хочу запустить, выглядит следующим образом:

#!/bin/bash
while [ 1 ]
do
  #do something
  sleep 1
  #do something
  sleep 1
done

inittab линия выглядит так: d666:123456:respawn:/root/script_to_run.sh

На уровне выполнения 2-6 все работает нормально. Когда я перехожу на уровень запуска 1 (init 1) скрипт останавливается и больше не выполняется.

Также я пытаюсь обработать скрипт, который будет вызван перед вводом уровня запуска 0. Я пробовал эту строчку в inittab: d667:0:wait:/root/script_to_run_right_before_runlevel_0.sh

1 ответ

Решение

Документация Debian не является явной, init(8) предупреждает только, что уровни выполнения S,0,1,6 зарезервированы, а также:

В системе Debian ввод уровня запуска 1 приводит к уничтожению всех процессов, за исключением потоков ядра и сценария, который выполняет уничтожение и другие процессы в своем сеансе. Как следствие этого, небезопасно возвращаться с уровня выполнения 1 на многопользовательский уровень выполнения: демоны, которые были запущены на уровне выполнения S и необходимы для нормальной работы, больше не работают. Система должна быть перезагружена.

Выполнить уровень 1 в /etc/inittab является:

l1:1:wait:/etc/init.d/rc 1

/etc/init.d/rc 1 позвоню /etc/rc1.d/S* в том числе S01killprocs который убивает большинство вещей, которые он может найти, и S21single, который выполняет "exec init -t1 S", чтобы переключиться в однопользовательский режим, поэтому уровень запуска 1 очень короток. Однопользовательский режим"S"в /etc/inittab является:

~~:S:wait:/sbin/sulogin

Который означает, что init будет просто ждать, пока ждать, пока sulogin возвращается, прежде чем делать что-либо еще.

Короче говоря, уровни запуска "1" и "S" являются "невмешательством" в Debian (и, вероятно, в большинстве других unixen).

Если вы поместите свою запись inittab над системной "S", то init возрождение и тому S01killprocs Сценарий будет бороться с этим некоторое время (вы можете не заметить этого без запущенного системного журнала), что, вероятно, очень сложно и, вероятно, не будет делать то, что вы хотите.

Вы можете получить часть того, что вам нужно, с помощью одного или обоих способов изменения сценариев запуска и реализации /etc/initscipt отслеживать и регистрировать различные действия init, Это действительно хороший способ подключить рабочую систему, поэтому я советую сначала поэкспериментировать с виртуальной машиной;-).

Я думаю, что ваши другие варианты, ни один из которых не кажется очень привлекательным, стоит попробовать другой initили посмотрите, можете ли вы делать то, что вы хотите через поток ядра.

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