Сценарии инициализации не запускаются

Я хочу создать скрипт, который будет запускаться при запуске уровня запуска 3 только один раз.
Поэтому сейчас я выполняю тесты, чтобы увидеть, действительно ли работает выполнение.

Я пытался создать файл в /etc/init.d/myscript который содержит:

#!/bin/bash

OUT="/dev/tty1"

echo -e "Hello world!" > $OUT

ps auxf > /path_to_some_folder/_script_ps_auxf.txt
runlevel > /path_to_some_folder/_runlevel.txt
id -u > /path_to_some_folder/id.txt
pwd > /path_to_some_folder/pwd.txt

В этом файле включен бит выполнения для всех пользователей (ugo).
Также я создал символическую ссылку на /etc/init.d/myscript в /etc/rc3.d/S99myscript, Затем я:

  1. Выйти из моего пользователя.
  2. Нажмите CTRL + ALT + F2 чтобы увидеть tty2,
  3. Войдите в мой пользователь и sudo service lightdm stop для того, чтобы отключить графический интерфейс.
  4. затем sudo init 3 для того, чтобы быть на уровне выполнения 3.

Но файлы в /path_to_some_folder/ не существует после init 3, Зачем?


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


Кроме того, я пытался редактировать /etc/rc.local такой, что код в /etc/init.d/myscript встроен в /etc/rc.local до exit 0 линии, но все равно ничего не происходит (файл не создается).


Обновление 6 октября, 18:00 UTC:

По какой-то причине теперь я могу видеть все файлы в каталоге /path_to_some_folder/:
(Я добавил ко всем файлам подчеркивание _ чтобы лучше их отличать от других файлов)

$ ls /path_to_some_folder/_*
/path_to_some_folder/_id.txt  /path_to_some_folder/_pwd.txt  /path_to_some_folder/_runlevel.txt  /path_to_some_folder/_script_ps_auxf.txt

По времени они все создаются при включении системы.

По проверке файла /path_to_some_folder/_script_ps_auxf.txt Я заметил, что процесс init был запущен:

/bin/bash /etc/init.d/myscript start

Поэтому я понимаю, что сценарии инициализации работают. Действительно, когда я нажимаю CTRL + ALT + F1 чтобы увидеть tty1 Я замечаю текст "Привет, мир!" вверху (до приглашения к входу).

Единственная проблема состоит в том, чтобы понять:

  1. Почему они работают сейчас?
  2. Почему скрипт выполняется по умолчанию на уровне запуска Ubuntu 16.04?
    Они должны быть выполнены только на уровне выполнения 3, см.:

    $ ls -1 /etc/rc*.d/*myscript*
    /etc/rc3.d/S99myscript
    

Отвечаю на вопрос № 1 сам:
Я подозреваю, что перезагрузка была необходима для работы сценариев инициализации.

По вопросу № 2:

Файл /etc/inittab не существует, поэтому он не может определить уровень запуска:

$ ls /etc/inittab
ls: cannot access '/etc/inittab': No such file or directory

Уровень запуска по умолчанию, в соответствии с /etc/init/rc-sysinit.conf, является 2:

$ grep -m 1 DEFAULT_RUNLEVEL= /etc/init/rc-sysinit.conf
env DEFAULT_RUNLEVEL=2

Нет параметров командной строки ядра в соответствии с файлом /etc/default/grub:

$ less /etc/default/grub | grep GRUB_CMDLINE_LINUX=
GRUB_CMDLINE_LINUX=""

Когда я включаю свой компьютер и авторизируюсь, я замечаю, что мой уровень запуска 5:

$ runlevel
N 5

Мой сценарий должен был работать только на уровне выполнения 3.

Есть идеи, что происходит?


Обновление 6 октября, 18:40 UTC:

Теперь я понимаю - уровень запуска Ubuntu отличается от стандартов, смотрите:
http://upstart.ubuntu.com/cookbook/

Это означает, что уровни запуска 2 в 5 все одинаковы

Графическая многопользовательская плюс сеть (ПО УМОЛЧАНИЮ)

1 ответ

Теперь я понимаю - уровень запуска Ubuntu отличается от стандартов, см.: http://upstart.ubuntu.com/cookbook/

Нет, на самом деле ты не понимаешь.

Вы работаете с ментальной моделью операционной системы, которая дважды была заменена на Ubuntu. Upstart был представлен несколько лет назад; и версия, которую вы используете сейчас (16.04), заменила даже эту.

Вы используете Ubuntu 16.04, системную операционную систему. Уровни выполнения "устарели" в соответствии с systemd doco. Вы можете забыть о них. Поваренная книга Upstart и страницы руководства для выскочек init не применяются (если вы явно не переключились обратно на выскочку).

Вам не нужно возиться с /etc/rc.local, Это из rc система, которая предшествовала ван Смуренбург rc система, которую вы ошибочно думаете, что используете сейчас. Это механизм, который был заменен три раза. /etc/inittab это тоже прошлое. У Убунту не было ван Смуренбурга init в течение десятилетия.

Вы используете Ubuntu 16.04. Не начинайте с версии 6 UNIX rc или ван Смуренбург rc; будьте осторожны, начиная с выскочки рабочих файлов; забыть о ван Смуренбурге init; и забудьте про уровни прохождения. Создайте сервисный модуль systemd и узнайте о целях.

(Или установите daemontools, или daemontools-encore, или freedt, или runit, или nosh, или perp, или s6, и узнайте о сервисах в стиле daemontools.)

дальнейшее чтение

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