systemdサービスの標準出力/標準エラーを表示する


175

カスタムアプリケーション用の単純なsystemdサービスファイルを作成しました。手動で実行するとアプリケーションは正常に動作しますが、systemdで実行するとCPUが最大になります。

私は私の問題がどこにあるかを追跡しようとしていますが、どこに出力があるのか​​わかりません(またはsystemdが出力をどこかに配置するように設定する方法)。

これが私のサービスファイルです。

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

アプリケーション全体で、stdoutとstderrに出力します。

デーモンの出力を読み取るにはどうすればよいですか?

編集:

を見つけましたがman systemd.execStandardOutput=オプションについて言及しましたが、どのように使用するのかわかりません。manページから:

StandardOutput=

実行されたプロセスのファイル記述子1(STDOUT)の接続先を制御します。inheritnullttysyslogkmsgkmsg + consolesyslog + consoleまたはsocketのいずれかを取ります

標準入力のファイル記述子を継承するように設定されている場合、標準出力用に複製されます。nullに設定すると、標準出力はに接続されます/dev/null。つまり、書き込まれたものはすべて失われます。ttyに設定されている場合、標準出力はttyに接続されます(を介して設定されたTTYPath=とおり、以下を参照)。TTYが出力に使用される場合、実行されたプロセスのみが端末の制御プロセスにならず、失敗したり、他のプロセスが端末を解放するのを待ったりしません。 syslogは標準出力をsyslog(3)システムロガーに接続します。 kmsgは、dmesg(1)を介してアクセス可能なカーネルログバッファに接続します。 syslog + consoleおよびkmsg + console同様に機能しますが、出力をシステムコンソールにもコピーします。 socketは、ソケットのアクティブ化から標準出力をソケットに接続します。セマンティクスはのそれぞれのオプションに似ていますStandardInput=。この設定はデフォルトで継承されます。

これは、これらが私の唯一のオプションであることを意味しますか?たとえば、出力を/dev/shm何かに入れたいです。Unixドメインソケットを使用して簡単なリスナーを作成できると思いますが、これは少し不要なようです。

デバッグに必要なのはこれだけで、おそらくほとんどのログを削除して、出力をsyslogに変更することになります。


/var/log/syslog出力を確認しようとしましたか?ほとんどのシステムは、ものにログインする/var/log/ので、そこからチェックすることから始めます。grep出力がわかっている場合は、テキストの検索に使用できますgrep "my output" /var/log。トリックを行う必要があります。
sbtkd85

@ sbtkd85-まあ、私は持っていませんが/var/log/syslog/var/log/messagesトリックをします。ログによれば、問題は、デーモンが起動時にクラッシュすることですが、HTTPサーバーを持っているためにデーモンがまだ実行されていることを確認でき、クエリを実行できます。残りのログが失われているようです
...-beatgammit

StandardOutput=ttyデーモンを起動したときに何が起こっているかを確認できるように設定してみてください。端末を出力する必要がありttyS0ます(画面に出力を表示するには、使用するか、類似する必要があります)。
sbtkd85

3
このコンテキストでは、標準のIOリダイレクト演算子は機能しません。何かのようなExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
ディーパックミッタル

実際にCPUを乱用しているのは何ですか?それはsystemdか、あなたのサービスか、システムですか(systemdが夢中になったためにサービスの新しいコピーを生成するなど)?
ペテルフ

回答:


184

更新

mikemaccanaが指摘しているように、systemdジャーナルは現在、ほとんどのディストリビューションにとって標準のロギングデバイスです。systemdユニットのstdoutand を表示するにstderrは、コマンドを使用しjournalctlます。

sudo journalctl -u [unit]

元の回答

デフォルトstdoutstderrは、systemdユニットのsyslogに送信されます。

完全なsystemdを使用している場合、これはを介してアクセス可能journalctlです。Fedoraでは、そうである必要があります/var/log/messagesが、syslogはルールが言うところにそれを置きます。

:による投稿の日付、およびにsystemdにさらされているほとんどの人がフェドーラを経由して、あなたはおそらく、ここで説明したバグに見舞われたと仮定されているに https://bugzilla.redhat.com/show_bug.cgi?id=754938 それは持っていますそれはすべての(これは、エラーメッセージがログに記録されないように、かつ、固定された原因のSELinuxポリシーのバグだった)=あまりにもどのように動作するかの良い説明selinux-policy-3.10.0-58.fc16


5
このような標準のログメカニズムを使用しても、デフォルトでは永続的なログ作成されないことに注意してください。これを行うには、/ var / log / journalを作成してから実行する必要がありますsudo systemctl restart systemd-journald
-mlissner

1
syslog機能と優先度
jrwren

2
これは私のために働いていた:StandardOutput=syslog+consoleそしてStandardError=syslog+consoleその後、私のユニットからのすべての出力はjournalctlに登場しました。デフォルト設定は明らかに間違っていました。(/etc/systemd/system.confのDefaultStandardOutputなど)
gregn3

2
-f私にとって役に立ちました。変更が発生すると(ユースケースは、デーモンとして実行されていたのMinecraftサーバーを以下た)ログに従っ
blaughw

2
これは私を夢中にさせています...標準のDebianストレッチでは、journalctlは標準出力をまったく表示しません。私も使用/usr/bin/stdbuf -oL <cmd>し、明示的にStandardOutput=journal。まだ何もありません。
jlhが

81

より短く、より単純な、非レガシーの回答:

sudo journalctl -u [unitfile]

[unitfile]はsystemd .service名です。たとえば、からのメッセージを表示するにはmyapp.service

sudo journalctl --unit=myapp

ログをリアルタイムで追跡するには:

sudo journalctl -f -u myapp

4
エラーが発生したsudo場合に必要になる可能性があることに注意してくださいNo journal files found
bigjosh

5
syslogはレガシーではありません...
Miles Rout

2
現在のLinuxディストリビューションにあります。あなたは本当にsyslogが好きかもしれませんが、それは彼らが出荷するものを変えません。
ミケマッカナ

1
承知しました。また、syslogも使用します。私のポイントは、systemdが使用されていないということではありませんが、syslogはレガシーではありません。
迷路

6
@JEComptonは、現在のLinuxディストリビューションでのすべてのロギングがjournaldを使用し、syslogが不要で互換性のためにのみ使用される場合、syslogはレガシーであると論理的に追跡します。
ミケマッカナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.