ゼロ除算エラーを意図的に作成したプログラムを作成しました。
コマンドラインで実行すると、「浮動小数点例外」が返されます。
しかし、これをsystemdサービスとして実行すると、このエラーメッセージが表示されません。私のsystemdスクリプトに追加しました:StandardError = journal
しかし、journalctlを使用すると、エラーメッセージはどこにも表示されません。このエラーメッセージを、journalctlを使用して表示されるログに追加するにはどうすればよいですか?
journalctl
を使用して実行中のサービスのすべてのエラーを取得するには:
$ journalctl -p 3 -xb
どこ -p 3
手段 priority err
、-x
は追加のメッセージ情報を提供し、-b
は、最後の起動以降を意味します
デフォルトでは、systemdユニットのstdoutとstderrがsyslogに送信されます。したがって、/var/log/messages
または/var/log/dmesg
ファイルでそれらにアクセスできます。
これを変更するには、次のコマンドを使用できます。
Sudo journalctl -u [yourunit]
ここで、[yourunit]はsystemd .service名です。たとえば、yourapp.serviceからのメッセージを表示するには、
Sudo journalctl --unit=yourapp
次に、コマンドを使用してjournalctlを再起動します
Sudo systemctl restart systemd-journald
これが機能しない場合は、systemdスクリプトにStandardOutput=syslog+console
およびStandardError=syslog+console
を追加して、systemctlを再起動します。その後、journalctlを使用してユニットの出力にアクセスできます。
JdeBPがヒントを出そうとしているため、シェルからプログラムを実行し、それがシグナルSIGFPEによって強制終了されると、特定のメッセージ「浮動小数点例外」がShellによって出力されます。技術的にはプログラムcouldはシグナルをキャッチし、そのように記述した場合はエラーを出力しますが、それはSIGKILLでは機能しません。
プログラムの終了ステータスを読み取り、それについてログを記録するには、wait()
または同様のものを使用するsome親プロセスが必要です。 systemd
サービスマネージャーはそのような親です。そのメッセージは同一に見えませんが、ジャーナルでサービスのログを見ると、すべきに相当するものがあります。 SIGFPE
について言及しているかもしれません。
さらに、systemd-coredump
を有効にしている場合、SIGFPE
のクラッシュメッセージがログに記録されるはずです。これは、この信号のデフォルトのアクションがコアダンプの生成であるためです。これらのクラッシュメッセージは、サービスのメッセージを照会するときに表示されるようにタグ付けする必要があります。私はsystemd-coredump
が好きで、必ずDebianシステムで有効にしてください。現在インストールすると、UbuntuのクラッシュレポーターであるApportが削除されます。開発時に、コアファイルを直接処理し、systemd-coredump
を使用しないことを好む人もいますが、コアダンプによってディレクトリが乱雑にならないのはいいことですが、しばらくするとクリーンアップされます(ディスクスペース)。