Сценарии инициализации не запускаются
Я хочу создать скрипт, который будет запускаться при запуске уровня запуска 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, Затем я:
- Выйти из моего пользователя.
- Нажмите
CTRL+ALT+F2чтобы увидетьtty2, - Войдите в мой пользователь и
sudo service lightdm stopдля того, чтобы отключить графический интерфейс. - затем
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 Я замечаю текст "Привет, мир!" вверху (до приглашения к входу).
Единственная проблема состоит в том, чтобы понять:
- Почему они работают сейчас?
Почему скрипт выполняется по умолчанию на уровне запуска 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.)
дальнейшее чтение
- Джонатан де Бойн Поллард (2015).
/etc/inittabэто вещь прошлого., Часто задаваемые ответы. - /questions/348485/kak-sbrosit-konfiguratsiyu-unity/348493#348493
- https://unix.stackexchange.com/a/204075/5132
- https://unix.stackexchange.com/a/233581/5132
- https://unix.stackexchange.com/a/247543/5132
- https://Ask-ubuntu.ru/a/618138/43344
- https://unix.stackexchange.com/a/211927/5132
- https://unix.stackexchange.com/a/200281/5132