Хорошо, Алекс, дело в том, что все процессы пользовательского пространства в Linux запускаются с init
процессом, pid которого равен 1. Например, запустите, pstree
чтобы увидеть дерево ваших процессов, корень которого - init. В настоящее время существует несколько версий init
реализации процесса. наиболее заметными являются
- sysVinit (классический init, до сих пор используется в некоторых дистрибутивах, включая старый Debian)
- Upstart init, используемый более старой Ubuntu и некоторыми RHEL (Red Hat) и более ранними версиями Fedora
- systemd init, используемый в современных версиях Fedora, Ubuntu, Debian, RHEL, SUSE
Традиционно 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
:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Это означает, что при переходе на уровень запуска 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]
respawn
exec mytrojan --argument X
Но если вам нужны зависимости, по крайней мере, файловые системы и сеть, возможно, имеет смысл заменить start on runlevel [02]
что-то вроде:
start on (local-filesystems and net-device-up IFACE!=lo)
ВНИМАНИЕ: я не проверял правильность этого, потому что я не могу. В частности, я не совсем уверен, как запустить скрипт после того, как ваше сетевое соединение запущено (я использовал эту версию ). Попробуйте прибегнуть к помощи "upstart on up сети".