의도적으로 0으로 나누기 오류를 생성하는 프로그램을 만들었습니다.
명령줄에서 이것을 실행하면 "부동 소수점 예외"가 반환됩니다.
하지만 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
. 하지만 코어 덤프가 디렉토리를 복잡하게 만들지 않고 잠시 후 정리된다는 점은 좋습니다(디스크 공간 확보).