Скрипт не запускается при загрузке с start-stop-daemon

Мой скрипт (расположенный в /etc/init.d) создает файл pid ($PIDFILE), но процесс не запущен. Мой сценарий демона включает в себя:

start-stop-daemon --start --quiet --pidfile $PIDFILE -m -b --startas $DAEMON --test > /dev/null || return 1

Скрипт отлично работает при выполнении его вручную.


person mjpsr11    schedule 28.11.2013    source источник


Ответы (2)


Вам необходимо создать стартовые ссылки.

sudo update-rc.d SCRIPT_NAME defaults

затем перезагрузитесь. SCRIPT_NAME это имя скрипта в /etc/init.d (без пути)

person hek2mgl    schedule 28.11.2013
comment
Все папки и файлы /etc/rc*.d/ включены и обновлены для сценария. Результат этой команды: Ссылки запуска/остановки системы для /etc/init.d/timekpr уже существуют. - person mjpsr11; 29.11.2013
comment
Я также sudo update-rc.d -f SCRIPT_NAME remove и sudo update-rc.d SCRIPT_NAME defaults. Сценарий может создать pid, но для него не запущен процесс. ps pid возвращает только пустой результат. - person mjpsr11; 29.11.2013
comment
Используется sysv-rc-conf --list SCRIPT_NAME с результатом 0: выкл. 1: выкл. 2: вкл. 3: вкл. 4: вкл. 5: вкл. 6: выкл., а runlevel равно N 2. - person mjpsr11; 29.11.2013
comment
Какой тип дистрибутива Linux вы используете? - person hek2mgl; 29.11.2013
comment
Linux Mint основан на Debian, поэтому он должен работать. К сожалению, на данный момент нет тестовой системы Mint. - person hek2mgl; 29.11.2013
comment
Нужен ли мне файл SCRIPT_NAME.conf в моей папке /etc/init? - person mjpsr11; 29.11.2013
comment
Нет. Проверьте это (начиная с версии 9.3) debian.org/doc/debian -policy/ch-opersys.html - person hek2mgl; 29.11.2013
comment
Mint (также основанный на Ubuntu) включает Upstart, который является альтернативой SysVinit в Debian. Интересно, есть ли конфликт между Upstart и SysVinit, который не позволяет моему сценарию оставаться в живых после загрузки. Если нет, SysVinit (используя start-stop-daemon) сначала создает pid (очевидно по файлу pid), а затем убивает его (очевидно, нет процесса с таким именем pid или демона). Каков наилучший способ отладки или регистрации выходных данных start-stop-daemon или процесса загрузки? - person mjpsr11; 29.11.2013
comment
В этом вы правы, upstart|SysVinit тема. Пока ничего не могу сказать, буду разбираться. Ожидается, что выскочка будет изящно работать со сценариями инициализации.. (по крайней мере, в более старых версиях Ubuntu) - person hek2mgl; 29.11.2013

Удалось заставить его работать, но перепробовал так много вещей, не знаю точно, что это исправило (вероятно, ошибка в скрипте или конфигурации). Тем не менее, я многому научился и хотел поделиться, так как я не могу найти многого в интернет-безднах.

Похоже, что Ubuntu (и многие другие дистрибутивы, основанные на Ubuntu, включая Mint) перешли на Upstart для управления заданиями и услугами. Upstart включает совместимость с SysVinit (с использованием демонов /etc/init.d), которая по-прежнему может использовать update-rc.d для управления демонами (так что, если вы знакомы с этим использованием, вы можете продолжать его использовать). Метод Upstart заключается в использовании одного файла .conf в папке /etc/init. Мой файл SCRIPT.conf очень прост (я использую скрипт Python):

start on filesystem or runlevel [2345]
stop on runlevel [016]

exec python /usr/share/python-support/SCRIPT/SCRIPT.py

Этот простой файл полностью заменяет стандартный скрипт в /etc/init.d оператором case для предоставления функций [start|stop|restart|reload] и указателем на /usr/bin/SCRIPT. Вы можете видеть, что он включает в себя элементы управления уровнями выполнения, которые обычно можно найти в файлах /etc/rc*.d (таким образом исключая несколько файлов).

Я попробовал update-rc.d для создания необходимых файлов /etc/rc*.d/ для моего демона. Мой сценарий демона bash находится в /etc/init.d и включает команду start-stop-daemon, как и в моем первоначальном вопросе. (Эта команда также отлично работает с терминала.)

У меня были файлы /etc/rc*.d/, сценарий bash в файле /etc/init.d и файле /etc/init/SCRIPT.conf во время загрузки, и кажется, что Upstart, вероятно, сначала ищет файл .conf для его направления. потому что команда SysVinit service SCRIPT [start|stop|restart|reload] возвращает неизвестный экземпляр, однако вы можете обнаружить, что процесс выполняется с ps -elf | grep SCRIPT_FILE.

Одна интересная вещь, на которую стоит обратить внимание, это разветвление вашего демона при использовании .conf. Сценарий, как написано выше, порождает только одну вилку демона. Однако полная независимость от исходного сценария возможна при использовании expect fork или expect daemon и respawn (см. Поваренную книгу Upstart). для справки). Их использование гарантирует, что ваш демон никогда не будет убит (по крайней мере, с помощью команды kill).

Я продолжал тестировать демон и процесс загрузки с помощью команды sudo initctl reload-configuration. Это перезагружает файлы конфигурации, в которых вы можете протестировать свой демон с помощью команды sudo [start|stop|restart] SCRIPT. Результат запуска команды:

$ sudo start SCRIPT
SCRIPT start/running, process xxxx

$ sudo restart SCRIPT
SCRIPT start/running, process xxxx

$ sudo stop SCRIPT
SCRIPT stop/waiting

Кроме того, в /var/log/upstart/SCRIPT.log есть хороший журнал, который дает вам полезную информацию для вашего демона во время загрузки. У меня все еще есть очень раздражающая ошибка, которая не позволяет root отображать сообщения osd с уведомлением-отправкой от моего демона. Мой файл журнала содержит предупреждение gtk (я открою еще один вопрос, чтобы попросить помощи).

Надеюсь, это поможет другим в разработке своих демонов.

person mjpsr11    schedule 30.11.2013
comment
Я не могу проверить всю эту информацию на данный момент, но ваши усилия ценятся :) - person hek2mgl; 01.12.2013