Apa perbedaan antara menjalankan program sebagai daemon dan memalsukannya dengan '&'?


Jawaban:


31

Cara tradisional daemonisasi adalah:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

Ini memastikan bahwa proses tidak lagi dalam kelompok proses yang sama dengan terminal dan dengan demikian tidak akan terbunuh bersama dengannya. Pengalihan IO adalah untuk membuat output tidak muncul di terminal.


5
jadi jika terminal yang memunculkan proses latar belakang (&) ditutup, proses latar belakang juga akan berakhir?
user1561108

9
Proses akan menerima SIGHUP ketika terminal keluar, pengendali default untuk sinyal tersebut adalah untuk menghentikan proses.
Dennis Kaarsemaker

12
Silakan tambahkan &penjelasan bagian untuk jawaban Anda. Sepertinya tidak lengkap .. jika Anda memeriksa pertanyaan aslinya.
mtk

1
Itu karena menjalankan sesuatu di latar belakang dengan & tidak membuat proses melakukan sesuatu yang istimewa :)
Dennis Kaarsemaker

34

Untuk daemon, yang Anda inginkan adalah proses yang tidak memiliki ikatan apa pun. Paling tidak, Anda ingin berada di sesi sendiri, tidak dilampirkan ke terminal, tidak memiliki file deskriptor yang diwarisi dari orangtua terbuka untuk apa pun, tidak memiliki orang tua yang merawat Anda (selain init) memiliki arus direktori /agar tidak mencegah umount ...

Untuk melepaskan diri dari terminal, Anda membuat sesi baru, namun, untuk membuat sesi, Anda tidak boleh menjadi pemimpin grup (atau sesi), jadi yang terbaik adalah dengan garpu proses baru. Dengan asumsi orang tua keluar, itu juga berarti bahwa proses tidak akan memiliki orang tua lagi dan akan diadopsi oleh init. Kemudian, tutup semua deskriptor file yang mungkin, Anda chdir("/")(orang tidak dapat menutup direktori kerja saat ini untuk melepaskan sumber daya seperti untuk deskriptor file, membuat /direktori kerja saat ini setidaknya tidak mencegah pelepasan direktori direktori).

Karena proses itu adalah pemimpin sesi, ada risiko bahwa jika pernah membuka perangkat terminal, itu menjadi proses pengendalian terminal itu. Forking untuk kedua kalinya memastikan hal itu tidak terjadi.

Di sisi lain, &, dalam shell interaktif, bercabang dan membuat grup proses baru (agar tidak berada di grup proses foreground terminal), dan dalam shell non-interaktif, garpu proses dan mengabaikan SIGINT di dalamnya. Itu tidak terlepas dari terminal, tidak menutup file deskriptor (meskipun beberapa shell akan membuka kembali stdin ke /dev/null) ...


apa gunanya chdir ("/")? menutup deskriptor file?
Timothy Leung

@TimothyLeung, lihat edit.
Stéphane Chazelas

8

Perbedaan antara menjalankan program / proses sebagai daemon dan forking ke latar belakang menggunakan ampersand pada dasarnya terkait dengan kepemilikan.

Paling sering, proses induk daemon adalah proses init (proses pertama yang dimulai pada sistem Unix), daemon yang menjadi anak dari proses itu berarti bahwa ia tidak berada di bawah kendali langsung Anda sebagai pengguna yang tidak memiliki hak istimewa. . Sementara di sisi lain, forking program / proses ke latar belakang berarti bahwa Anda dapat setiap saat memanggilnya kembali ke latar depan dan / atau membunuhnya.


1
Juga untuk menjawab sisi teknis di atas melepaskan suatu proses versus menjadikannya sebagai anak terminal, Anda dapat mencoba menjalankan "nohup firefox &"
Odaym

7

Dengan command &Proses Anda akan dibunuh oleh sinyal SIGHUP ketika orang tua meninggal.

Sysadmin memiliki akses ke beberapa solusi, meskipun.

Pada sistem bash, Anda dapat menggunakan:

(trap '' HUP; command) &

Ini membuka subkulit, menjebak HUPsinyal dengan handler kosong dan mengamplasnya.

Output mungkin masih bisa diarahkan ke yang salah tty. Atau tersesat.
Anda mungkin memperbaikinya dengan &>command.out, 1>output.outatau2>errors.out

Anda mungkin juga memiliki akses, pada sebagian besar sistem, ke nohupperintah.
nohupsangat menyederhanakan proses ini. Ini cukup standar, tetapi saya menemukan banyak busybox tertanam distribusi ARM yang hilang itu. Anda baru saja menulis:

nohup command &

..dan kamu sudah selesai. Output akan dialihkan, IIRC, ke nohup.out, tetapi nama file ini dapat diubah dengan opsi.


2
Hanya untuk dicatat bahwa dengan ZSH Anda dapat memisahkan command &kemudian dari shell disownyang kemudian berfungsi sebagai post-nohup.
matematika
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.