Apa perbedaan praktis dari sudut pandang sysadmin ketika menggunakan layanan pada sistem berbasis unix?
46
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.
&
penjelasan bagian untuk jawaban Anda. Sepertinya tidak lengkap .. jika Anda memeriksa pertanyaan aslinya.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
) ...sumber
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.
sumber
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:
Ini membuka subkulit, menjebak
HUP
sinyal dengan handler kosong dan mengamplasnya.Output mungkin masih bisa diarahkan ke yang salah
tty
. Atau tersesat.Anda mungkin memperbaikinya dengan
&>command.out
,1>output.out
atau2>errors.out
Anda mungkin juga memiliki akses, pada sebagian besar sistem, ke
nohup
perintah.nohup
sangat menyederhanakan proses ini. Ini cukup standar, tetapi saya menemukan banyak busybox tertanam distribusi ARM yang hilang itu. Anda baru saja menulis:..dan kamu sudah selesai. Output akan dialihkan, IIRC, ke
nohup.out
, tetapi nama file ini dapat diubah dengan opsi.sumber
command &
kemudian dari shelldisown
yang kemudian berfungsi sebagai post-nohup.