종료하기 전에 시스템 로깅의 마지막 줄의 단위 속성을 수정하는 방법은 무엇입니까?

종료하기 전에 시스템 로깅의 마지막 줄의 단위 속성을 수정하는 방법은 무엇입니까?

stdout에 기록하는 시스템 서비스가 있습니다. 거기에서 systemd는 STDOUT을 캡처하여 저널에 씁니다.

echo일부 진단을 수행한 다음 0이 아닌 오류 코드로 종료하는 오류를 처리하기 위해 일반적인 관용구를 사용합니다 .

echo "my final error";
exit 1;

내 문제는 이 마지막 echo줄이 저널에 들어가지만 내 "단위"와 제대로 연결되지 않는다는 것입니다. 을 보면 journalctl -o json-pretty차이점이 무엇인지 알 수 있습니다. 최종 로깅에는 _SYSTEMD_CGROUP 및 _SYSTEMD_UNIT 속성이 없습니다.

제가 생각하는 것은 일종의 경쟁 조건입니다. 나는 bash 스크립트가 journald종료 라인으로 이동하기 전에 완전히 처리될 때 까지 기다리지 않는다고 생각합니다 . 따라서 로그 항목 처리가 완료되기 exit전에 해당 행에 도달합니다 . 로깅을 보낸 을( 를) 찾으려고 시도 하지만 장치가 더 이상 실행되지 않기 때문에 지금은 찾을 수 없습니다.journaldjournaldunit

sleep 1내 말이 맞다면 내 진술 앞에 넣어서 문제를 해결할 수 있을 것입니다 exit 1. 하지만 최종 로그 속성을 표시하는 더 좋은 방법이 있습니까?

systemdUbuntu 16.04에서 버전 229를 사용하고 있습니다 .

답변1

@mark-stosberg, 이는 알려진 문제입니다.Journald는 /proc 대 SCM_CREDS 경주로 인해 해당 cgroup으로 종료된 프로세스에서 들어오는 메시지를 특성화할 수 없습니다.

다음에서 해결 방법을 찾을 수 있습니다.https://github.com/systemd/systemd/issues/2913#issuecomment-219702148

노력하다SyslogIdentifier=

로깅 시스템이나 커널 로그 버퍼로 전송되는 로그 행의 접두사로 프로세스 이름을 설정합니다.

그리고 달리다journalctl _SYSTEMD_UNIT=unit + UNIT=unit + SYSLOG_IDENTIFIER=id

답변2

제가 조사해본 결과, 이런 것 같습니다.다음에 대한 풀 요청이 있는 systemd의 알려진 문제.

수정 사항에는 서비스에 대한 메타데이터 캐싱이 포함되므로 서비스가 종료된 경우에도 서비스에 대한 메타데이터를 계속 사용하여 마지막 몇 개의 로그를 적절하게 분류할 수 있습니다.

그것은 또한 간주됩니다CoreOS에서 버그 열기, systemd를 사용합니다.

이 버그는 systemd freedesktop.org 버그 추적기에서도 다음과 같이 추적됩니다.

추가 테스트에서는 로그 속성 누락 문제가 다음과 같이 더 심각한 것으로 나타났습니다.사용자단위-- 그건 별개의 문제인 것 같아요. 을 위한체계단위의 경우 경쟁 조건은 상대적으로 작으며 sleep 1;서비스 스크립트에서 종료 직전에 추가하면 마지막 로그가 인쇄되기 전에 충분한 패딩을 추가하고 문제를 해결하기 위해 종료할 수 있습니다.

관련 정보