Nie udało mi się mkfifo
podstępem pracować zadowalająco; Wygląda na to, że nie przechwycił stderr, a próby przekierowania spowodowały, że Upstart zwolnił za kaucją bez błędów.
Ma również niefortunny efekt uboczny, sprawiając, że logger
proces zostaje zawieszony jako dziecko init
, więc informacja o tym, kto „jest właścicielem” programu rejestrującego, zostaje utracona, a każdy, kto nie jest świadomy tego, mkfifo
może założyć, że jest to ryzykowny proces, który można zabić.
Zamiast tego otrzymałem następujące rozwiązanie, które rozwiązuje wszystkie te problemy. Powoduje, logger
że staje się procesem potomnym, zachowując usługę jako proces root. Niestety wymaga wykonania bash
, ale po prostu wygląda na brudne.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Wykorzystuje sztuczkę, która przekierowuje stdout i stderr do polecenia. Ponieważ wykonujemy usługę wewnątrz bash
polecenia, ma to efekt uboczny polegający na zastąpieniu powłoki i magicznym uczynieniu basha procesem potomnym usługi, jak pokazano ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Z jakiegoś powodu powyższe polecenie musi być spakowane w bash -c
. Zakładam, że dzieje się tak, ponieważ Upstart udaje, że uruchamia twój skrypt przez Bash, ale tak naprawdę nie jest. Jeśli ktoś może zasugerować sposób na uniknięcie dodatkowej powłoki bash, byłoby to niesamowite.