Ok, Alex, intinya adalah bahwa semua proses userspace di Linux dimulai dengan init
proses, yang pid adalah 1. Misalnya, jalankan pstree
untuk melihat pohon proses Anda, yang akarnya adalah init .. Ada beberapa versi init
implementasi proses saat ini , yang paling terkenal adalah
- sysVinit (init klasik, masih digunakan oleh beberapa distribusi, termasuk Debian yang lebih lama)
- Init pemula, digunakan oleh Ubuntu lama dan beberapa RHEL (Red Hat) dan versi Fedora yang lebih lama
- systemd init, digunakan oleh versi modern Fedora, Ubuntu, Debian, RHEL, SUSE
Secara tradisional, Unix menggunakan implementasi init yang disebut sysVinit
init, disebut dengan nama https://ru.wikipedia.org/wiki/UNIX_System_V versi Unix. Ini sangat berpengaruh dan init lainnya kompatibel dengan itu.
Pada dasarnya, sysVinit pertama kali membaca /etc/inittab
file, memutuskan, runlevel mana yang akan dijalankan dan memberitahu /etc/init.d/rc
skrip untuk mengeksekusi skrip init. Misalnya ketika biasanya melakukan booting ke runlevel multi-pengguna, yang biasanya runlevel 2 di Ubuntu , /etc/init.d/rc
mulai menjalankan skrip /etc/rc2.d
. File hanya ada tautan simbolis ke skrip, sedangkan skrip itu sendiri disimpan dalam /etc/init.d
direktori. Penamaan symlink dalam /etc/rc*.d
direktori adalah sebagai berikut. Katakanlah, kami memiliki skrip berikut di /etc/rc2.d
:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Ini berarti, bahwa pada saat beralih ke runlevel 2 init proses pertama membunuh network-manager
proses, menyebabkan nama skripnya dimulai dengan K
- K02network-manager
dan kemudian memulai proses, yang namanya dimulai dengan S
. Dua digit setelah S
atau K
adalah angka dari 00 hingga 99, yang menentukan urutan, proses dimulai. Misalnya rsyslog
dimulai sebelumnya apache2
, karena 16 kurang dari 17 (itu masuk akal, karena Anda ingin apache mengandalkan kapasitas logging rsyslog , jadi rsyslog harus dimulai terlebih dahulu). Skrip adalah skrip kasual, dijalankan oleh #!/bin/sh
.
Jadi, pada dasarnya untuk memulai sebuah program saat startup dalam gaya sysVinit, tulis skrip Anda sendiri (salin-tempel dari contoh apa pun, Anda dapat /etc/init.d
), letakkan di dalamnya /etc/init.d
dan buat symlink ke sana dengan nama yang masuk akal, misalnya
S99mytrojan
di /etc/rc2.d
. Berikut ini penjelasan tentang skrip sysVinit pada /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html
Sekarang, orang-orang Ubuntu memutuskan bahwa mereka menginginkan fungsionalitas tambahan dari init. Mereka menginginkan OS booting cepat, jadi mereka ingin skrip mereka dieksekusi secara paralel; mereka ingin proses mati dimulai kembali secara otomatis; mereka ingin proses untuk saling memanggil secara eksplisit oleh peristiwa (sehingga apache dijalankan oleh acara "syslog dimulai", dan syslog dijalankan oleh peristiwa "mount sistem file" dll, jadi kami memiliki acara bukannya beberapa angka 00 -99). Dengan demikian, mereka telah membuat Upstart dan inilah cara kerjanya. Skrip init pemula dimasukkan ke dalam /etc/init
direktori (jangan bingung dengan /etc/init.d
). Pemula biasanya berjalan /etc/init.d/rc
juga, jadi itu akan mengeksekusi skrip sysVinit Anda secara normal. Tetapi jika Anda ingin skrip Anda direspawn saat keluar - Peristiwa pemula adalah untuk Anda.
Meskipun saya tidak dapat memeriksa apakah skrip saya berfungsi, saya kira, bahwa untuk tujuan Anda, Anda harus menulis /etc/init/mytrojan.conf
skrip berikut :
start on runlevel [02]
respawn
exec mytrojan --argument X
Tetapi jika Anda membutuhkan dependensi, setidaknya sistem file dan jaringan, mungkin masuk akal untuk mengganti start on runlevel [02]
dengan sesuatu seperti:
start on (local-filesystems and net-device-up IFACE!=lo)
PERINGATAN: Saya tidak memeriksa kebenaran ini, karena saya tidak bisa. Terutama, saya tidak begitu yakin tentang cara memulai skrip setelah koneksi jaringan Anda aktif dan berjalan (saya menggunakan versi ini ). Coba googling untuk "pemula pada jaringan atas".