Я пытаюсь запустить скрипт на уровне запуска 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 ответ1

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 respawning и сценарий S01killprocs некоторое время будут бороться с этим (вы можете не заметить этого без работающего системного журнала), что, вероятно, очень быстро и, вероятно, выиграно делай что хочешь.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .