it-swarm-ja.com

systemdサービスのstdout / stderrを表示する

カスタムアプリケーション用の簡単な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.execオプションが記載されているStandardOutput=を見つけましたが、その使用方法がわかりません。 man page から:

StandardOutput=

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

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

これが私の唯一の選択肢ということですか?たとえば、出力を/dev/shmなどに入れたいと思います。 Unixドメインソケットを使用して単純なリスナーを作成できると思いますが、これは少し不要なようです。

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

196
beatgammit

更新

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

Sudo journalctl -u [unit]

元の回答

デフォルトでは、systemdユニットのstdoutおよびstderrがsyslogに送信されます。

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

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

201
Matt

より短く、よりシンプルで、非レガシーな答え:

Sudo journalctl -u [unitfile]

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

Sudo journalctl --unit=myapp

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

Sudo journalctl -f -u myapp
90
mikemaccana