stdout에 기록하는 시스템 서비스가 있습니다. 거기에서 systemd는 STDOUT을 캡처하여 저널에 씁니다.
echo
일부 진단을 수행한 다음 0이 아닌 오류 코드로 종료하는 오류를 처리하기 위해 일반적인 관용구를 사용합니다 .
echo "my final error";
exit 1;
내 문제는 이 마지막 echo
줄이 저널에 들어가지만 내 "단위"와 제대로 연결되지 않는다는 것입니다. 을 보면 journalctl -o json-pretty
차이점이 무엇인지 알 수 있습니다. 최종 로깅에는 _SYSTEMD_CGROUP 및 _SYSTEMD_UNIT 속성이 없습니다.
제가 생각하는 것은 일종의 경쟁 조건입니다. 나는 bash 스크립트가 journald
종료 라인으로 이동하기 전에 완전히 처리될 때 까지 기다리지 않는다고 생각합니다 . 따라서 로그 항목 처리가 완료되기 exit
전에 해당 행에 도달합니다 . 로깅을 보낸 을( 를) 찾으려고 시도 하지만 장치가 더 이상 실행되지 않기 때문에 지금은 찾을 수 없습니다.journald
journald
unit
sleep 1
내 말이 맞다면 내 진술 앞에 넣어서 문제를 해결할 수 있을 것입니다 exit 1
. 하지만 최종 로그 속성을 표시하는 더 좋은 방법이 있습니까?
systemd
Ubuntu 16.04에서 버전 229를 사용하고 있습니다 .
답변1
@mark-stosberg, 이는 알려진 문제입니다.Journald는 /proc 대 SCM_CREDS 경주로 인해 해당 cgroup으로 종료된 프로세스에서 들어오는 메시지를 특성화할 수 없습니다.
다음에서 해결 방법을 찾을 수 있습니다.https://github.com/systemd/systemd/issues/2913#issuecomment-219702148
로깅 시스템이나 커널 로그 버퍼로 전송되는 로그 행의 접두사로 프로세스 이름을 설정합니다.
그리고 달리다
journalctl _SYSTEMD_UNIT=unit + UNIT=unit + SYSLOG_IDENTIFIER=id
답변2
제가 조사해본 결과, 이런 것 같습니다.다음에 대한 풀 요청이 있는 systemd의 알려진 문제.
수정 사항에는 서비스에 대한 메타데이터 캐싱이 포함되므로 서비스가 종료된 경우에도 서비스에 대한 메타데이터를 계속 사용하여 마지막 몇 개의 로그를 적절하게 분류할 수 있습니다.
그것은 또한 간주됩니다CoreOS에서 버그 열기, systemd를 사용합니다.
이 버그는 systemd freedesktop.org 버그 추적기에서도 다음과 같이 추적됩니다.
추가 테스트에서는 로그 속성 누락 문제가 다음과 같이 더 심각한 것으로 나타났습니다.사용자단위-- 그건 별개의 문제인 것 같아요. 을 위한체계단위의 경우 경쟁 조건은 상대적으로 작으며 sleep 1;
서비스 스크립트에서 종료 직전에 추가하면 마지막 로그가 인쇄되기 전에 충분한 패딩을 추가하고 문제를 해결하기 위해 종료할 수 있습니다.