15.04のsystemdはユニットの標準出力を記録しません


12

現在、Webサーバーとしてsystemdユニットを作成しようとしています。現在、私のfoo.serviceファイルは次のようになっています。

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

foo実行ファイルは、自動的にstdoutにすべてのHTTPリクエストをログに記録します-これは十分にテストされています。ただし、でログを表示するとjournalctl -u foo、次のような出力しか得られません。

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

誰かがそれがすべての標準出力を記録しない理由を説明できますか?この前の質問を簡単に見てみましたが、助けにはなりません-しかし、「... 完全な systemdを使用しないシステムではうまくいかないかもしれない」という行に沿って何かをほのめかしました-Ubuntu 15.04の場合?事前に感謝します、これに関するどんな助けも大歓迎です!


1
プロセスが出力をバッファリングしていないことを確認してください。私は同様の問題を抱えていましたが、Pythonスクリプトの出力バッファリングを無効にすることで解決しました。生成されたログレコードの数が多くないため、ログは記録されていないように見えましたが、実際にはまだすべてがstdout出力バッファに収集されていたため、チャンスはありませんでした。
1月Vlcinsky

1
これも修正しようとしています。systemdはバッファリングを行うという印象を持っています。UNIXではstdoutは行バッファリングされますが、systemdは独自の処理を行い、さらに高速にバッファリングします(高速になりますが、役に立たない場合があります)。
ベルカン

私は同じ問題を抱えていたので、Pythonの印刷機能でのバッファリングが問題でした!私はPython 3を使用print('Hello World!', flush=True)していたので、次のようなものを使用しただけで、うまくいきました!journalctlに出力が表示され始めました。
ティンブラム

回答:


9

実際、UNIXでのバッファリングはコンテキストに依存します。stdoutがコンソールのようなインタラクティブなものにリダイレクトされる場合-通常はラインバッファリングされ、そうでない場合は完全にバッファリングされます。

setvbufライブラリ呼び出しを使用して、アプリケーション内でバッファリングを変更できます。

ただし、起動時にstdbufコマンドを使用して実行することもできます。

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(ラインバッファリングの場合)


これは私の一日を救った!どうもありがとうございました。しかしExecStart=/my/foo/program、サービスが終了したときにstdoutログがフラッシュされず、代わりに完全に消える理由を、私は少し混乱しています。
wlnirvana

0

Ubuntu 15.04のデフォルトでは、systemdジャーナルは揮発性であり、保持され/run/systemd/journal、再起動のたびに失われます。永続的な systemdジャーナルを使用するには、/var/log/journalディレクトリを作成する(およびsystemd-journald.serviceを再起動する)必要があります。

そのため、stdout出力はsystemdジャーナルにsyslog保存されるだけでリダイレクトされるだけです。そのためには、上で説明したように永続的なsystemdジャーナルを使用する必要があるかもしれません。

ログを確認し/var/log/syslogましたfooか?


/var/log/journalあなたが言ったように作成しましたが、とにかくsystemdサービスの標準出力が表示されません。で/var/log/syslog私はそれを見ない。
ログオフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.