Tôi đã không có được mkfifo
mánh khóe để làm việc thỏa đáng; nó dường như không bắt được stderr và cố gắng chuyển hướng khiến Upstart không được bảo lãnh.
Nó cũng có một tác dụng phụ đáng tiếc là làm cho logger
quá trình này bị xáo trộn khi còn nhỏ init
, vì vậy thông tin về người "sở hữu" logger bị mất và bất kỳ ai cũng không biết mkfifo
rằng đó có thể là một quá trình nguy hiểm có thể bị giết.
Thay vào đó tôi đã kết thúc với giải pháp sau đây, giải quyết tất cả các vấn đề này. Nó gây ra logger
trở thành một quá trình con, trong khi bảo tồn dịch vụ như là quá trình gốc. Thật không may, nó đòi hỏi phải thực thi bash
, nhưng nó trông có vẻ bẩn.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Điều này sử dụng một thủ thuật chuyển hướng stdout và stderr thành một lệnh. Vì chúng tôi thực thi dịch vụ bên trong bash
lệnh, điều này có tác dụng phụ là thay thế vỏ và làm cho phép bash trở thành một quy trình con của dịch vụ, như được hiển thị bởi ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Vì một số lý do, lệnh trên phải được gói trong a bash -c
. Tôi cho rằng điều này là do Upstart chỉ giả vờ chạy tập lệnh của bạn thông qua Bash, nhưng thực tế không phải vậy. Nếu bất cứ ai có thể đề xuất một cách để tránh vỏ bash thêm, đó sẽ là tuyệt vời.