Daemonisasi suatu proses dalam shell?

9

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/ memberikan contoh proses daemonisasi suatu proses dalam bash:

$ nohup firefox& &> /dev/null

Jika saya benar, perintahnya sama dengan "nohup dan background a process". Tetapi bukankah daemon lebih dari sekadar proses nohupped dan background?

Langkah-langkah apa yang hilang di sini untuk daemonisasi suatu proses?

Misalnya, bukankah mengubah proses induk diperlukan saat melakukan daemonisasi suatu proses? Jika ya, bagaimana Anda melakukannya di bash? Saya masih mencoba memahami balasan terkait https://unix.stackexchange.com/a/177361/674 .

Apa langkah dan ketentuan lainnya?

Lihat pertanyaan terkait saya https://stackoverflow.com/q/35705451/156458

Tim
sumber
1
tergantung pada definisi Anda tentang daemon. Jika Anda hanya bermaksud menjalankan di latar belakang terpisah dari terminal maka ya Anda menjalankan firefox sebagai daemon. Daemon "standar", bagaimanapun, biasanya tidak dijalankan oleh pengguna, memiliki skrip init dan pencatatan, dan biasanya semacam keamanan, seringkali apparmor atau selinux tergantung pada apakah Anda menjalankan Ubuntu atau Fedora (atau serupa). Lihat linfo.org/daemon.html .
Panther
1
Lihat start-stop-daemon di Debian; Saya akan meninggalkan di sini utas terkait dari stack overflow stackoverflow.com/questions/16139940/... yang lebih menarik daripada halaman mentah
Rui F Ribeiro

Jawaban:

10

Dari artikel Wikipedia tentang daemon :

Dalam lingkungan Unix, proses induk daemon sering, tetapi tidak selalu, proses init. Daemon biasanya dibuat oleh proses yang memproses proses anak dan kemudian segera keluar, sehingga menyebabkan init untuk mengadopsi proses anak, atau dengan proses init secara langsung meluncurkan daemon. Selain itu, daemon yang diluncurkan oleh forking dan exiting biasanya harus melakukan operasi lain, seperti memisahkan proses dari terminal pengendali (tty). Prosedur seperti itu sering diimplementasikan dalam berbagai rutinitas kenyamanan seperti daemon (3) di Unix.

Baca halaman manual daemonfungsi.

Menjalankan perintah latar belakang dari shell yang segera keluar hasil dalam proses PPID menjadi 1. Mudah untuk menguji:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

Seperti yang Anda lihat, proses tersebut dimiliki oleh PID 1, tetapi masih terkait dengan TTY. Jika saya keluar dari shell login ini, kemudian login lagi, dan lakukan pslagi, TTY menjadi ?.

Baca di sini mengapa penting untuk melepaskan diri dari TTY .

Menggunakan setsid(bagian dari util-linux):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

Saya pikir Anda bahkan tidak perlu mengarahkan stdin, stdout dan stderr.

Gene Pavlovsky
sumber
3
Lihatlah daemonize . Selain alat yang bagus, ia memiliki penjelasan yang cukup bagus tentang apa itu daemon.
Gene Pavlovsky
Saya hanya ingin tahu apakah Anda tahu cara untuk memisahkan proses dari tty tanpa keluar dari shell dari mana proses itu muncul?
StoneThrow
1
@StoneThrow "tanpa keluar dari shell dari mana proses itu muncul" Jika Anda menggunakan bash -cpembungkus, tidak ada TTY yang terkait dengan proses. Ini seperti dia menunjukkannya.
Bruno Bronosky
@StoneThrow tetapi melakukan tes ini echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'akan menunjukkan kepada Anda bahwa itu adalah TTY yang sama persis untuk keduanya, tetapi perilaku yang ditunjukkan untuk mendapatkan TTY ?masih terjadi meskipun Anda tidak pernah "keluar dari shell" atau menutup TTY.
Bruno Bronosky
-1

Deamon, dengan namanya tidak lebih dari program yang berjalan sampai 1. sistem dimatikan; 2. diminta untuk berhenti. Selain itu, ia tidak memiliki makna sihir.

Dalam keadaan tersebut, menjalankan skrip bash di latar belakang dengan nohup, dapat mengklasifikasikannya sebagai proses daemon.

Apa yang Anda harapkan untuk ditemukan dan tidak ditemukan? Jika Anda mengalami masalah, sebutkan kode sampel dan segmen data sampel untuk meminta bantuan lebih lanjut. Pertanyaan Anda, seperti yang ada sekarang terlalu luas / umum.

MelBurslan
sumber
Terima kasih. Saya pikir posting saya memiliki semua yang Anda minta di paragraf terakhir Anda.
Tim
4
Umm ini tidak benar. Daemon tidak memiliki Terminal pengendali, tidak memiliki stdout atau stderr, dan beberapa hal lainnya. Baca bait pertama software.clapper.org/daemonize
Rich Homolka