Saya menggunakan Ubuntu 12.04 dan ingin memulai layanan, ketika sistem di-boot secara normal.
Sebagai 'layanan' saya mengerti beberapa kode, misalnya cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x yang seharusnya dijalankan seolah-olah telah dimulai pada baris perintah. Ada layanan yang harus dimulai sebagai pengguna normal, tetapi juga layanan yang harus dimulai sebagai root (pada kenyataannya, tidak diperlukan layanan untuk dijalankan pada level pengguna).
Saya juga perlu mengonfigurasi perilaku ketika 'layanan' berhenti. Saya ingin mereka di-restart dalam kasus saya, dengan argumen yang sama, di direktori yang ditentukan.
Semua layanan harus dimulai secara otomatis ketika sistem dimulai dengan normal, yaitu jika saklar daya ditekan. Tidak ada tindakan lain yang harus dilakukan.
Ada beberapa dokumen yang tersebar di internet, tetapi semuanya membingungkan saya. Mereka bicara tentang init
, init.d
, rc.d
, tapi aku tidak pernah melihat instruksi langkah-demi-langkah sederhana untuk mengikuti untuk dengan mudah sebagai layanan menggunakan misalnya pemula. Jika ini mudah, saya akan sangat menghargai jika langkah-langkah itu diberikan di sini.
Ok, Alex, intinya adalah bahwa semua proses userspace di Linux dimulai dengan
init
proses, yang pid adalah 1. Misalnya, jalankanpstree
untuk melihat pohon proses Anda, yang akarnya adalah init .. Ada beberapa versiinit
implementasi proses saat ini , yang paling terkenal adalahSecara 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
:Ini berarti, bahwa pada saat beralih ke runlevel 2 init proses pertama membunuh
network-manager
proses, menyebabkan nama skripnya dimulai denganK
-K02network-manager
dan kemudian memulai proses, yang namanya dimulai denganS
. Dua digit setelahS
atauK
adalah angka dari 00 hingga 99, yang menentukan urutan, proses dimulai. Misalnyarsyslog
dimulai sebelumnyaapache2
, 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, misalnyaS99mytrojan
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.htmlSekarang, 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 :Tetapi jika Anda membutuhkan dependensi, setidaknya sistem file dan jaringan, mungkin masuk akal untuk mengganti
start on runlevel [02]
dengan sesuatu seperti: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".
sumber