私はmkfifo
満足に動作するためのトリックを得られませんでした。stderrをキャプチャーしていないようで、リダイレクトしようとすると、Upstartはエラーなしで保釈されました。
また、logger
プロセスをの子として持ちこたえるという不幸な副作用もあるinit
ため、ロガーを「所有」してmkfifo
いるユーザーに関する情報は失われます。
代わりに、これらの問題をすべて解決する次のソリューションになりました。これは、原因となるlogger
ルートプロセスとしてサービスを維持しながら、子プロセスになること。残念ながら、exec'ing bash
が必要ですが、見た目は汚いだけです。
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
これは、stdoutとstderrをコマンドにリダイレクトするトリックを使用します。bash
コマンド内でサービスを実行するため、次のように、シェルを置き換えて魔法のようにbashをサービスの子プロセスにするという副作用がありますps aufxw
。
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
何らかの理由で、上記のコマンドはにラップする必要がありbash -c
ます。これは、UpstartがBashを介してスクリプトを実行するふりをするが、実際にはそうではないためだと思います。誰かが余分なbashシェルを回避する方法を提案できるなら、それは素晴らしいでしょう。