Добре, Алекс, справа в тому, що всі процеси простору користувачів в 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-реалізацію під назвою sysVinitinit, яку називають іменем 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 для "швидкої запуску в мережі".