Добре, Алекс, справа в тому, що всі процеси простору користувачів в 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'es використовував init-реалізацію під назвою sysVinit
init, яку називають іменем https://ru.wikipedia.org/wiki/UNIX_System_V версії Unix. Він дуже впливовий, інші інітити сумісні з ним назад.
В основному, sysVinit спочатку зчитує /etc/inittab
файл, вирішує, який запуску рівня запускати, і каже /etc/init.d/rc
скрипту виконувати так звані скрипти init. Наприклад, коли він зазвичай завантажується на багатокористувацький пробіг, який, як правило, працює на рівні Ubuntu 2 , /etc/init.d/rc
починає виконувати сценарії в /etc/rc2.d
. У файлах є лише символічні посилання на скрипти, а самі сценарії зберігаються в /etc/init.d
каталозі. Називання цих посилань у /etc/rc*.d
довідниках відбувається таким чином. Скажімо, у нас є такі сценарії /etc/rc2.d
:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Це означає, що при переході на runlevel 2 init процес спочатку вбиває network-manager
процеси, викликає його ім'я скрипта починається з K
-, K02network-manager
а потім починає процеси, імена яких починаються з S
. Двозначні цифри після S
або K
- це число від 00 до 99, яке визначає порядок, процеси запускаються. Наприклад rsyslog
, запускається раніше apache2
, тому що 16 менше 17 (це має сенс, тому що потрібно, щоб апаш покладався на можливості реєстрації 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 і ось як це працює. Вищезапущені initscripts поміщаються в /etc/init
каталог (не плутати з /etc/init.d
). Запуск запуску зазвичай /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)
Попередження: Я не перевірив правильність цього, тому що не можу. Тим більше, я не зовсім впевнений у тому, як запустити скрипт після того, як ваше мережне з'єднання буде запущене (я використовував цю версію ). Спробуйте googling для "швидкої запуску в мережі".