Saya menulis skrip shell yang ingin saya jalankan sebagai daemon pada startup tanpa menggunakan alat eksternal seperti daemontools atau daemonize .
Linux Daemon Writing HOWTO
Menurut Linux Daemon Writing HOWTO , daemon yang tepat memiliki karakteristik sebagai berikut:
- garpu dari proses induk
- menutup semua file deskriptor (yaitu,
stdin
,stdout
,stderr
) - membuka log untuk penulisan (jika dikonfigurasi)
- mengubah direktori kerja menjadi yang persisten (biasanya
/
) - mengatur ulang mode file mask (umask)
- membuat ID Sesi unik (SID)
daemonize Pendahuluan
The daemonize Pendahuluan berjalan lebih jauh, yang menyatakan bahwa daemon khas juga:
- terlepas dari terminal kontrolnya (jika ada) dan mengabaikan semua sinyal terminal
- terlepas dari kelompok prosesnya
- menangani
SIGCLD
Bagaimana saya melakukan semua ini dalam sh
, dash
atau bash
naskah dengan alat Linux umum saja?
Skrip harus dapat dijalankan pada sebanyak mungkin distro tanpa perangkat lunak tambahan, meskipun Debian adalah fokus utama kami.
CATATAN: Saya tahu ada banyak jawaban di jaringan StackExchange yang merekomendasikan penggunaan nohup
atau setsid
, tetapi tidak satu pun dari metode ini yang menangani semua persyaratan di atas.
EDIT: Halaman daemon (7) juga memberikan beberapa petunjuk, meskipun tampaknya ada beberapa perbedaan antara SysV
daemon gaya lama dan yang lebih baru systemd
. Karena kompatibilitas dengan berbagai distro penting, harap pastikan jawabannya memperjelas perbedaan.
sumber
daemon
dan hal-hal lain untuk menjalankan skrip shell sewenang-wenang tanpa ketentuan untuk menjalankan sebagai sebuah daemon. Karena Anda penulis, sepenuhnya mengendalikan bagaimana skrip itu ditulis, buatlah sehingga skrip tersebut dapat diluncurkan dari systemd unitfile atau skrip rc.d. Anda tidak menentukan "Proper"!Jawaban:
Menggunakan systemd Anda harus dapat menjalankan skrip sebagai daemon dengan membuat unit sederhana. Ada banyak opsi berbeda yang bisa Anda tambahkan tetapi ini sesederhana mungkin.
Katakanlah Anda memiliki skrip
/usr/bin/mydaemon
.Anda membuat unit
/etc/systemd/system/mydaemon.service
.Untuk memulai iblis yang Anda jalankan
Untuk memulai saat boot Anda mengaktifkannya
Jika pada sistem berbasis systemd, yang mayoritas distro Linux ada saat ini, ini sebenarnya bukan alat eksternal. Yang negatif adalah bahwa itu tidak akan bekerja di mana pun.
sumber
systemd
tidak lebih dari "alat eksternal" daripadabash
.Saya mungkin kehilangan sesuatu di sini; mengapa tepatnya tidak
nohup
tepat? Tentu saja itu tidak cukup sendiri , tetapi menambahkannya langsung saja.Sejauh yang saya bisa lihat:
stdin
mati di akhir skrip indukinit
(atausystemd
)Aku punya perasaan kuat aku kehilangan yang jelas. Downvote, tapi tolong beri tahu saya apa itu :-)
sumber
nohup
dengan&
dan pengalihan I / O untuk meluncurkan beberapaC
utilitas non- daemon dengan keamanan tambahan yang membungkusnohup
perintah Anda di dalam asu -c "nohup ... &" -s /bin/bash systemUser
untuk menjalankan daemon sebagai pengguna yang tidak memiliki hak istimewa.screen
Perintah Linux yang terdapat di sebagian besar distro dapat mengubah bentuk skrip shell. Saya sering menggunakannya. Berikut adalah contoh cepat untuk memulai, daftar, dan keluar dari sesi layar terpisah ...sumber
screen
tidak menghapuskan skrip shell. Itu hanya menjalankan mereka di terminal dibedakan dan dapat melepaskan dari terminal ini (seperti mencabut keyboard dari PC) tanpa sesi penutupan. Jadi, program yang berjalan di terminal terpisah berjalan di latar belakang. Oleh karena itu - lepaskan program lulus di latar belakang.