Saya tidak mendapatkan mkfifo
trik untuk bekerja dengan memuaskan; tampaknya tidak menangkap stderr, dan upaya untuk mengarahkan menyebabkan Upstart gagal tanpa kesalahan.
Ini juga memiliki efek samping yang disayangkan membuat logger
proses berkeliaran sebagai seorang anak init
, sehingga informasi tentang siapa "yang memiliki" penebang hilang, dan siapa pun yang belum sadar mkfifo
akan menganggap itu adalah proses menjuntai yang dapat dibunuh.
Alih-alih saya berakhir dengan solusi berikut, yang menyelesaikan semua masalah ini. Itu menyebabkan logger
menjadi proses anak, sambil menjaga layanan sebagai proses root. Sayangnya, ini membutuhkan eksekusi bash
, tetapi itu hanya terlihat kotor.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Ini menggunakan trik yang mengarahkan ulang stdout dan stderr ke sebuah perintah. Karena kami mengeksekusi layanan di dalam bash
perintah, ini memiliki efek samping mengganti shell dan secara ajaib menjadikan bash menjadi proses turunan dari layanan, seperti yang ditunjukkan oleh ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Untuk beberapa alasan perintah di atas harus dibungkus dengan a bash -c
. Saya berasumsi ini karena Pemula hanya berpura-pura menjalankan skrip Anda melalui Bash, tetapi sebenarnya tidak. Jika ada yang bisa menyarankan cara untuk menghindari shell bash ekstra, itu akan luar biasa.