Apa perbedaan antara start-stop-daemon dan berlari dengan &?

18

Saya mengatur layanan di /etc/init.d. Saya melihat berbagai skrip di sana, beberapa diimplementasikan dengan start-stop-daemon ...dan beberapa dengan /path/to/script &.

Semuanya menyimpan pid dalam file dan melakukan beberapa pemeriksaan.

Apa praktik terbaik, apa perbedaannya, apa yang penting diketahui di sini ...? (secara umum)

Dalam kasus khusus saya, saya memiliki server http localhost ringan sederhana di Jawa yang aplikasi akan memanggil sekali setiap jam dan itu hanya memberikan nomor acak bodoh (tidak ada rincian lebih lanjut di sini, saya hanya berarti itu tidak menggunakan sistem file atau utas atau apa pun yang rumit dalam hal ini dalam pertanyaan saya)

Terima kasih

Thomas
sumber

Jawaban:

27

Pekerjaan latar belakang (mis. Dimulai dengan &) masih memiliki stdin, stdout, dan stderr terhubung ke terminal tempat dimulainya. Itu mungkin tiba-tiba menulis (mis. Pesan kesalahan) ke terminal ("mengganggu" pekerjaan di latar depan) atau jeda menunggu input dari keyboard (Anda harus meletakkannya di latar depan). Anda tentu saja dapat mengarahkan stdout dan stderr ke file atau ke / dev / null untuk mencegah pekerjaan latar belakang dari menulis ke terminal.

Pekerjaan latar belakang juga dapat diletakkan di latar depan - misalnya. pekerjaan latar depan saat ini dihentikan, dan perintah fg(latar depan) digunakan untuk menempatkan pekerjaan latar belakang di latar depan. Pekerjaan latar belakang juga dapat dicapai oleh sinyal dari terminal - mis. SIGHUP ketika Anda menutup terminal, yang biasanya mengakhiri (sebagian besar) program dimulai di terminal.

Daemon - seperti yang dimulai secara otomatis oleh init.d, tetapi yang juga dapat dimulai secara manual dari terminal - di sisi lain, berjalan terputus dari terminal mana pun. Sekalipun secara manual dimulai dari terminal, daemon akan terputus dari terminal, sehingga daemon tidak dapat menulis (stdout, stderr) atau membaca (stdin) itu. Ini juga "kebal" terhadap sinyal yang dikirim "secara otomatis" oleh terminal. (meskipun Anda dapat mengirim sinyal ke sana dengan menggunakan kill -signal pid).

"Latar Belakang" dan "latar depan" mengacu pada status proses ke beberapa terminal - apakah prosesnya saat ini mengendalikan terminal atau tidak. Karena daemon tidak terhubung ke terminal (tetapi secara maticousily terputus darinya dalam segala hal), maka daemon tidak dapat dikatakan berjalan di latar belakang. Daemon hanyalah proses yang berjalan tanpa dikaitkan dengan terminal - baik di depan maupun di belakang.

Jika Anda menggunakan psopsi yang menunjukkan terminal mana yang digunakan suatu proses, Anda akan melihat bahwa kedua pekerjaan depan dan belakang diasosiasikan dengan terminal (mis. Tty2). Daemon di sisi lain, punya "?" di lapangan ini.

Daemon biasanya beahave seperti itu, bahkan jika mereka mulai secara manual. Membuat daemon milik Anda sendiri, cukup banyak pekerjaan - ada beberapa tipu daya yang terlibat untuk benar-benar melepaskannya dari terminal. Anda harus membuat sendiri pengguna / grup untuk dijalankan sebagai. Anda biasanya harus menggunakan / tmp, / var / tmp atau / var / run jika Anda ingin membuat file - biasanya tidak boleh memiliki hak di tempat lain. Karena tidak dapat melaporkan kesalahan ke terminal, Anda harus membuatnya menulis ke file-log (mis. File itu sendiri di / var / log). Daemon harus membuat entri di / var / run dengan PID saat ini, dan harus memeriksa apakah instance lain sudah berjalan. Seharusnya menghormati kunci (/ var / kunci) untuk file atau perangkat yang berlaku. Ini harus menanggapi SIGHUP dengan memuat ulang file konfigurasi dan menggunakan konfigurasi yang diperbarui.

Poin lainnya adalah cara kerja sebagian besar daemon. Daemon biasanya merupakan executable tunggal yang dapat dijalankan dalam satu dari dua mode berbeda; tergantung pada apakah itu daemon asli - induknya - dimulai saat boot atau secara manual ... atau anak yang dilahirkan oleh induk ini. Proses induk biasanya hanya duduk dan menunggu beberapa peristiwa - waktu tertentu, waktu berlalu, upaya untuk terhubung ke port jaringan tertentu, atau apa pun. Ketika ini terjadi, orang tua menciptakan proses anak yang identik dengan dirinya sendiri (menggunakan fork () system-call) - dan segera kembali untuk menunggu acara lain (dan mungkin melahirkan lebih banyak anak). Ini adalah proses anak yang benar-benar akan melakukan pekerjaan - seperti menyinkronkan disk, menjalankan perintah (misalnya cron) atau membuat koneksi jaringan (misalnya sshdatauftpd). Satu-satunya perbedaan antara orang tua dan anak, adalah bahwa mereka mendapat PID yang berbeda dan bahwa PPID (Parent-PID) anak adalah PID dari proses induk - ini dapat digunakan untuk menentukan apakah prosesnya adalah induk atau anak. Jadi proses yang sama harus dapat beroperasi dalam dua mode - sebagai induk menunggu (dan melahirkan), atau sebagai anak yang bekerja.

Meskipun tidak sulit untuk menulis daemon, ini juga tidak sepele - seperti yang Anda lihat ada beberapa "trik" yang harus Anda ketahui terlebih dahulu. Secara umum, saya akan berpikir menulis daemon akan membutuhkan banyak usaha untuk mendapatkan sangat sedikit dibandingkan dengan alternatif lain:

Menggunakan nohupatau disownpada latar belakang-pekerjaan biasanya merupakan alternatif yang cukup baik, karena membuat proses tetap hidup bahkan jika terminal ditutup. Seringkali merupakan ide yang bagus untuk mengarahkan ulang stdout dan stderr ke suatu file atau ke / dev / null. Untuk program yang lebih interaktif, screenadalah cara yang baik untuk menyimpan sesuatu "hingga" Anda membutuhkannya. at, batchdan crontabjuga layak dipertimbangkan.

Baard Kopperud
sumber
1
Saya juga ingat dari kursus sistem unix lama saya, bahwa ketika diluncurkan dari terminal server juga harus meninggalkan [grup proses] [ en.wikipedia.org/wiki/Process_group] . Sejauh yang saya ingat. Sehingga proses tersebut kebal sinyal dari terminal aslinya.
Yves Baumes