15.04에 systemd는 장치의 stdout을 기록하지 않습니다.


12

현재 시스템 단위를 웹 서버로 만들려고합니다. 현재 내 foo.service파일은 다음과 같습니다.

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

foo실행 파일은 자동으로 표준 출력에 모든 HTTP 요청을 기록 -이 잘 테스트됩니다. 그러나로 로그를 볼 때 journalctl -u foo다음과 같은 결과 만 얻습니다.

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

누군가 stdout 출력을 모두 기록하지 않는 이유를 설명 할 수 있습니까? 이 이전 질문을 간단히 보았지만 도움이되지는 않지만 "... 전체 시스템을 사용하지 않는 시스템에서는 작동하지 않을 수 있습니다"라는 선을 따라 무언가를 암시 했습니다. 우분투 15.04의 경우입니까? ? 미리 감사드립니다. 이에 대한 도움을 주시면 감사하겠습니다!


1
프로세스가 출력을 버퍼링하지 않는지 확인하십시오. 비슷한 문제가 있었고 파이썬 스크립트의 출력 버퍼링을 비활성화하여 해결되었습니다. 생성 된 로그 레코드 수가 많지 않기 때문에 로깅이없는 것처럼 보였지만 실제로는 여전히 stdout 출력 버퍼에 모두 수집 되었기 때문에 아직 기회가 없었습니다.
Jan Vlcinsky

1
이것도 고치려고합니다. systemd가 버퍼링을한다는 인상을 받았습니다. stdout은 UNIX에서 라인 버퍼링되지만 systemd는 자체 작업을 수행하고 훨씬 더 많이 버퍼링합니다 (빠르지 만 쓸모가 없을 수도 있음).
Velkan

나는 같은 문제가 있었고 파이썬의 인쇄 기능으로 버퍼링하는 것이 문제였습니다! 파이썬 3을 사용하고 있었기 때문에 방금 비슷한 것을 사용 print('Hello World!', flush=True)했으며 그 트릭을 수행했습니다! journalctl에 출력이 표시되기 시작했습니다.
timbram

답변:


9

실제로 UNIX에서의 버퍼링은 컨텍스트에 따라 다릅니다. stdout이 콘솔과 같은 대화식으로 리디렉션 될 때 일반적으로 라인 버퍼링됩니다. 그렇지 않으면 완전히 버퍼링됩니다.

setvbuf 라이브러리 호출을 사용하여 애플리케이션 내에서 버퍼링을 변경할 수 있습니다 .

그러나 시작시 stdbuf 명령을 사용하여 수행 할 수도 있습니다 .

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(라인 버퍼링 된 경우)


이것은 나의 하루를 구했다! 대단히 감사합니다. 그러나 ExecStart=/my/foo/program서비스가 종료 될 때 stdout 로그가 플러시되지 않고 대신 완전히 사라지는 이유 는 약간 혼동 됩니다.
wlnirvana 5

0

에 기본적으로 우분투 15.04 , systemd 저널은 휘발성를 유지하고 /run/systemd/journal각 다시 부팅 할 때 손실됩니다. 지속적 시스템 저널 을 사용하려면 /var/log/journal디렉토리 를 작성하고 systemd-journald.service를 다시 시작 해야합니다 .

그래서, 할 수있다, stdout출력은 단지로 재 syslog와에 보관하지 systemd 저널. 이를 위해 위에서 설명한대로 영구 시스템 저널 을 사용해야 할 수도 있습니다 .

당신 /var/log/syslog은 당신의 foo로그 를 확인 했습니까 ?


나는 /var/log/journal당신이 언급 한대로 만들었지 만 어쨌든 내 시스템 서비스의 stdout을 보지 못했습니다. 에 /var/log/syslog나는이 둘 다 볼 수 없습니다.
로그 오프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.