意図的にゼロ除算エラーを生成するプログラムを作成しました。
コマンドラインでこれを実行すると、「浮動小数点例外」が返されます。
ただし、systemd
サービスとして実行すると、このエラーメッセージは表示されません。
私のsystemd
スクリプトに以下を追加しました。
StandardError=journal
ただし、使用中にエラーメッセージを見ることはできませんjournalctl
。を使用して表示されたログにこのエラーメッセージを追加するにはどうすればよいですかjournalctl
?
答え1
実行中のサービスに関するすべてのエラーを取得するには、次のコマンドを使用しますjournalctl
。
$ journalctl -p 3 -xb
ここで-p 3
意味はpriority err
追加の-x
メッセージ情報を提供し、-b
最後の開始からの時間を示します。
答え2
デフォルトでは、systemdデバイスのstdoutとstderrはsyslogに送信されます。したがって、ファイル/var/log/messages
や/var/log/dmesg
。
これを変更するには、次のコマンドを使用できます。
sudo journalctl -u [yourunit]
ここで、[yourunit]はシステムの.service名です。たとえば、yourapp.service のメッセージを表示するには、
sudo journalctl --unit=yourapp
次に、次のコマンドを使用してJournalctlを再起動します。
sudo systemctl restart systemd-journald
それでも問題が解決しない場合は、systemdスクリプトにおよびをStandardOutput=syslog+console
追加してsystemctlを再起動してください。StandardError=syslog+console
その後、Journalctlを使用してデバイスの出力にアクセスできます。
答え3
JdeBPが暗示しようとしているように、シェルでプログラムを実行し、SIGFPE信号によってプログラムが終了すると、「浮動小数点例外」という特定のメッセージが印刷されます。シェル。技術的にあなたのプログラムできるこのように書くと、信号を捕捉してエラーを出力します。しかし、SIGKILLでは機能しません。
あなたはする必要があります一部親プロセスは、wait()
または同様の方法を使用してプログラムの終了ステータスを読み取り、それを記録します。サービスマネージャsystemd
はそのような親です。情報は同じように見えませんが、しなければならないログ内のサービスログを見ると、同様の内容があります。言及されるかもしれませんSIGFPE
。
また、このシグナルを有効にした場合、このシグナルの基本操作はコアダンプを生成することであるため、systemd-coredump
競合メッセージを記録する必要があります。SIGFPE
これらの競合メッセージは、サービスがメッセージを照会するときに表示されるようにマークする必要があります。私はsystemd-coredump
Debianシステムでこの機能を有効にして有効にするのが好きです。ただし、現在インストールすると、UbuntuのクラッシュレポートApportが削除されます。開発時には、一部の人が使用するのではなく、コアファイルで直接作業することを好むかもしれませんsystemd-coredump
。ただし、コアダンプがディレクトリを複雑にすることなく、しばらくしてからクリーンアップされることをお勧めします(ディスク容量の確保)。