Сервисы в linux - очень просто

    Имеем:
  • Ubuntu 12.04

Пора написать шпаргалку по созданию сервисов в linux и установки последовательности их запуска и т.д.

Сервис - это обычная программа , скрипт .sh, .py (в общем все , что может выполняться)

1. Где он стартует?
/etc/init.d/(тут любое имя файла без расширения)
например /etc/init.d/mqttwarn (с правами -rwxr-xr-x)
внутри по-сути выполняется start-stop-daemon команда . Вот ее ключи

    Commands:
  • -S|--start -- ... start a program and pass to it
  • -K|--stop stop a program
  • -T|--status get the program status
  • -H|--help print help information
  • -V|--version print version
    Matching options (at least one is required):
  • -p|--pidfile pid file to check
  • -x|--exec program to start/check if it is running
  • -n|--name process name to check
  • -u|--user process owner to check
  • Options:
  • -g|--group run process as this group
  • -c|--chuid
  • change to this user/group before starting
  • process
  • -s|--signal signal to send (default TERM)
  • -a|--startas program to start (default is )
  • -r|--chroot chroot to before starting
  • -d|--chdir change to (default is /)
  • -N|--nicelevel add incr to the process' nice level
  • -P|--procsched
  • use with for the kernel
  • process scheduler (default prio is 0)
  • -I|--iosched use with to set the IO
  • scheduler (default prio is 4)
  • -k|--umask change the umask to before starting
  • -b|--background force the process to detach
  • -m|--make-pidfile create the pidfile before starting
  • -R|--retry check whether processes die, and retry
  • -t|--test test mode, don't do anything
  • -o|--oknodo exit status 0 (not 1) if nothing done
  • -q|--quiet be more quiet
  • -v|--verbose be more verbose

там можно посмотреть примеры других сервисов и тупо скопировать


2. Когда он стартует?
это устанавливается командой update-rc.d
update-rc.d [-n] start|stop NN runlvl [runlvl] [...] .

    или по русски
  • update-rc.d [-n] имя start|stop NN уровень_запуска [уровень_запуска]... . start|stop NN уровень_запуска [уровень_запуска]... . ...


например sudo update-rc.d mqttwarn start 99 2 3 4 5 . stop 01 0 1 6 .
добавит такие ссылки для запуска:

    Adding system startup for /etc/init.d/mqttwarn ...
  • /etc/rc0.d/K01mqttwarn -> ../init.d/mqttwarn
  • /etc/rc1.d/K01mqttwarn -> ../init.d/mqttwarn
  • /etc/rc6.d/K01mqttwarn -> ../init.d/mqttwarn
  • /etc/rc2.d/S99mqttwarn -> ../init.d/mqttwarn
  • /etc/rc3.d/S99mqttwarn -> ../init.d/mqttwarn
  • /etc/rc4.d/S99mqttwarn -> ../init.d/mqttwarn
  • /etc/rc5.d/S99mqttwarn -> ../init.d/mqttwarn
    удаление ссылок запуска
  • update-rc.d [-n] [-f] имя remove

В общем-то и вся идея.

/etc/init.d/ Каталог, содержащий действующие сценарии инициализации.
/etc/rc?.d/ Каталоги, содержащие ссылки, используемые init и управляемые update-rc.d.
/etc/init.d/skeleton Модель, используемая для написания сценариев init.d.

http://manpages.ylsoftware.com/ru/update-rc.d.8.html

У меня возникла одна нерешимая проблема с сервисами. Установил mosquitto mqttwarn , запускаю как сервис. mqttwarn по датчику движению запускал guvcview и показывал на экране видео с камеры. Так вот при запуске от обычного пользователя в Десктопе (под X Window) guvcview запускается , а вот когда как сервис стартует (от root) вообще ничего.