Я использую Ubuntu 12.04 и хочу, чтобы служба запускалась, когда система загружается нормально.
Под «сервисом» я понимаю некоторый код, например, cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x, который просто должен быть запущен, как если бы он был запущен в командной строке. Есть службы, которые должны быть запущены как обычный пользователь, но также и службы, которые должны быть запущены как root (на самом деле, службы не должны запускаться на уровне пользователя).
Мне также требуется настроить поведение, когда «служба» останавливается. Я хочу, чтобы они были перезапущены в моем случае с тем же аргументом в указанном каталоге.
Все службы должны запускаться автоматически при нормальном запуске системы, т. Е. При нажатии выключателя питания. Никаких других действий не требуется.
В Интернете есть несколько документов, но все они меня смущают. Они не говорить о том init
, init.d
, rc.d
, но я никогда не видел простой в последующей шаг за шагом инструкции легко в качестве службы с использованием , например , выскочка. Если это легко, я был бы признателен, если бы эти шаги были приведены здесь.
Хорошо, Алекс, дело в том, что все процессы пользовательского пространства в Linux запускаются с
init
процессом, pid которого равен 1. Например, запустите,pstree
чтобы увидеть дерево ваших процессов, корень которого - init. В настоящее время существует несколько версийinit
реализации процесса. наиболее заметными являютсяТрадиционно Unix'ы использовали реализацию
sysVinit
init, называемую init, называемую по имени https://ru.wikipedia.org/wiki/UNIX_System_V версии Unix. Это очень влиятельно, и другие объекты обратно совместимы с ним.По сути, sysVinit сначала читает
/etc/inittab
файл, решает, какой уровень запуска запускать, и указывает/etc/init.d/rc
сценарию выполнять так называемые сценарии инициализации. Например, когда он обычно загружается с многопользовательского уровня запуска, который обычно является уровнем запуска 2 в Ubuntu ,/etc/init.d/rc
начинает выполнять сценарии в/etc/rc2.d
. В файлах есть только символические ссылки на скрипты, а сами скрипты хранятся в/etc/init.d
каталоге. Наименование этих символических ссылок в/etc/rc*.d
каталогах выглядит следующим образом. Скажем, у нас есть следующие скрипты/etc/rc2.d
:Это означает, что при переходе на уровень запуска 2 процесс init сначала убивает
network-manager
процессы, потому что его имя сценария начинается сK
-,K02network-manager
а затем запускает процессы, чьи имена начинаются сS
. Две цифры послеS
илиK
- это число от 00 до 99, которое определяет порядок, в котором запускаются процессы. Напримерrsyslog
, запускается раньшеapache2
, потому что 16 меньше 17 (это имеет смысл, потому что вы хотите, чтобы apache полагался на возможности ведения журнала rsyslog , таким образом, rsyslog должен быть запущен первым). Скрипты являются случайными скриптами оболочки, выполняемыми#!/bin/sh
.Итак, чтобы запустить программу при запуске в стиле sysVinit, напишите свой собственный скрипт (скопируйте его из любого примера, который у вас есть
/etc/init.d
), поместите его/etc/init.d
и создайте символическую ссылку на него под разумным именем, например,S99mytrojan
в/etc/rc2.d
. Вот объяснение типичных скриптов sysVinit в /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.htmlТеперь ребята из Ubuntu решили, что они хотят получить дополнительную функциональность от init. Они хотели бы иметь быструю загрузку ОС, поэтому они хотели, чтобы их скрипты выполнялись параллельно; они хотели, чтобы мертвые процессы были автоматически перезапущены; они хотели, чтобы процессы вызывали друг друга явным образом по событиям (чтобы apache запускался событием «syslog начался», а syslog запускался событием «смонтированные файловые системы» и т. д., поэтому у нас есть события вместо некоторых чисел 00) -99). Таким образом, они сделали Upstart и вот как это работает. Начальные скрипты выскочки помещаются в
/etc/init
каталог (не путайте с/etc/init.d
). Upstart обычно/etc/init.d/rc
тоже запускается , поэтому он будет нормально выполнять ваши скрипты sysVinit. Но если вы хотите, чтобы ваш скрипт появлялся при выходе - события Upstart для вас.Хотя я не могу проверить, работает ли мой скрипт, я полагаю, что для ваших целей вы должны написать следующий
/etc/init/mytrojan.conf
скрипт:Но если вам нужны зависимости, по крайней мере, файловые системы и сеть, возможно, имеет смысл заменить
start on runlevel [02]
что-то вроде:ВНИМАНИЕ: я не проверял правильность этого, потому что я не могу. В частности, я не совсем уверен, как запустить скрипт после того, как ваше сетевое соединение запущено (я использовал эту версию ). Попробуйте прибегнуть к помощи "upstart on up сети".
источник