Saya menggunakan skrip init untuk menjalankan proses sederhana, yang dimulai dengan:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS
Proses yang disebut $ DAEMON biasanya mencetak informasi log ke keluaran standarnya. Sejauh yang saya tahu, data ini tidak disimpan di mana pun.
Saya ingin menulis atau menambahkan stdout $ DAEMON ke file di suatu tempat.
Satu-satunya solusi yang saya tahu adalah memberi tahu start-stop-daemon untuk memanggil shellscript alih-alih $ DAEMON secara langsung; skrip kemudian memanggil $ DAEMON dan menulis ke logfile. Tapi itu membutuhkan skrip tambahan yang, seperti memodifikasi daemon itu sendiri, tampaknya cara yang salah untuk menyelesaikan tugas umum semacam itu.
sumber
--start
dengan--stop
benar - benar berfungsi.start-stop-daemon --test (...)
Seperti apa tampilan yang menyertainya ?>>
bukan>
untuk menambahkan.Anda perlu melakukan:
Juga jika Anda menggunakan
--chuid
atau--user
, pastikan pengguna dapat menulis ke/var/log
atau yang sudah ada/var/log/some.log
. Cara terbaik adalah dengan meminta pengguna tersebut memiliki/var/log/subdir/
.sumber
bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"
pkill
solusinya juga. Ingin tahu apa yang akan dilakukan... -c "exec $DAEMON..."
(menambahkan "exec"). Tidak ada ini di piring sekarang jadi tidak bisa mencobanya.Tampaknya Anda sekarang dapat menggunakan
--no-close
parameter tersebut saat mulaistart-stop-daemon
menangkap keluaran daemon. Fitur baru ini tersedia dalamdpkg
paket sejak versi 1.16.5 di Debian:sumber
start-stop-daemon
. Namun versi openrc memiliki opsi-1
dan-2
untuk mengarahkan stdout dan stderr masing-masing.Dengan openrc (yang merupakan default pada gentoo atau alpine linux misalnya)
start-stop-daemon
memiliki opsi-1
dan-2
:Jadi Anda bisa menulis:
sumber
Tidak terlalu sulit untuk menangkap keluaran daemon dan menyimpannya ke file:
Namun solusi ini mungkin kurang optimal
logrotate
.Mungkin lebih baik untuk menangkap keluaran ke syslog. Di Debian, ini akan cocok dengan perilaku layanan systemd. Upaya langsung berikut untuk menulis ulang contoh di atas salah karena meninggalkan dua proses tanpa induk ("zombie") (pencatat dan daemon) setelah menghentikan daemon karena
start-stop-daemon
hanya menghentikan anaknya tetapi tidak semua turunannya:Untuk membuatnya bekerja kita membutuhkan pembungkus yang menghentikan anak-anaknya setelah menerima
duende :SIGTERM
daristart-stop-daemon
. Ada beberapa:Catatan:
uid=65534
adalah penggunanobody
.Kelebihan : ini bekerja dan relatif mudah.
daemon :Kekurangan : 4 proses (supervisor
duende
, forknya dengan hak istimewa yang dijatuhkan (logger),su
dan daemon itu sendiri); wajib--chroot
; Jika daemon langsung berhenti (mis. Perintah tidak valid)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
laporkan sebagai berhasil dimulai.Kelebihan : 3 proses (supervisor
daemon
,su
dan daemon itu sendiri).Kekurangan : Sulit untuk dikelola
$PIDFILE
karena opsi baris perintah daemon yang membingungkan ; Jika daemon langsung berhenti (mis. Perintah tidak valid)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
laporkan sebagai berhasil dimulai.pipexec ( pemenang ):
Kelebihan : 3 proses (supervisor
pipexec
,logger
dan daemon itu sendiri); Jika daemon langsung berhenti (mis. Perintah tidak valid)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
laporkan kegagalan dengan benar.Kekurangan : tidak ada.
Inilah pemenangnya - solusi termudah dan rapi yang tampaknya berfungsi dengan baik.
sumber
Biasanya
start-stop-daemon
menutup deskriptor file standar saat berjalan di latar belakang. Dari halaman manualstart-stop-daemon
:Yang ini berhasil untuk saya:
sumber
Mengutip milis lama:
https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html
sumber
Saya tidak yakin apakah "$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2> & 1" akan menutup deskriptor file untuk file log ... yang berarti jika daemon Anda berjalan selamanya, saya tidak yakin bahwa logrotate atau mekanisme lain untuk membersihkan ruang disk akan berfungsi. Karena ini> bukannya >>, perintah yang disarankan juga akan memotong log yang ada saat restart. Jika Anda ingin melihat mengapa daemon macet, dan restart otomatis, itu mungkin tidak terlalu membantu.
Pilihan lain mungkin adalah "$ DAEMON | logger". logger adalah perintah yang akan masuk ke syslog (/ var / log / messages). Jika Anda membutuhkan stderr juga, saya rasa Anda dapat menggunakan "$ DAEMON 1> & 2 | logger"
sumber
>>
umumnya lebih sesuai untuk daemon, meskipun ini berarti Anda sekarang harus membuat aturan logrotate!--no-close ... | logger
tidak berfungsi untuk saya (Debian 7.3, start-stop-daemon 1.16.12). Skrip start-stop-daemon tidak kembali, meskipun / var / log / messages diisi :-). Saya mencobanya dengan dan tanpa1>&2
.Dengan asumsi itu bash (meskipun beberapa shell lain mungkin mengizinkan ini juga), baris:
akan mengirim semua keluaran standar masa depan ke file itu. Itu karena
exec
tanpa nama program hanya melakukan sihir pengalihan. Daribash
halaman manual:Manajemen file tersebut tentu saja merupakan masalah lain.
sumber
start-stop-daemon
baris pertanyaan awal yang disebutkan?Bagaimana tentang:
sumber