나는 다음과 같은 서비스를 가지고 있습니다 :
[Unit]
Description="Hoping to get rich"
[Service]
ExecStart='/home/me/Dev/hellogoogle.sh'
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=default.target
보시다시피 이것은 쉘 스크립트를 실행하는 매우 간단한 서비스입니다. 쉘 스크립트는 다음과 같습니다:
#!/usr/bin/sh
echo "Here we go"
ping google.com | grep '.'
echo "And we're rich"
위 스크립트를 사용하여 서비스를 시작하면 내가 얻는 유일한 출력은 입니다 Here we go
. 그러나 IE를 제거하면 | grep '.'
출력을 파이프하지 않으며 서비스는 echo 명령이 표시하는 내용을 표시합니다.
이것은 저널드를 사용하여 출력을 모니터링하는 방법입니다.
journalctl --follow --user-unit=hello-google.service
여기서 무슨 일이 일어나고 있는지 이해하도록 도와줄 수 있는 사람이 있나요? 스크립트가 출력의 일부를 다른 명령으로 파이프하기 때문에 systemd가 쉘 스크립트의 출력을 표시하지 않는 이유는 무엇입니까?
이렇으니 참고해주세요사용자시스템이 아닌 서비스.
답변1
좋아, 좀 더 조사해 보니 grep
출력을 버퍼링한 다음 명령이 끝난 후에도 표시하지 않는 것이 문제인 것 같습니다. 아직도 왜 이런 일이 발생하는지 잘 모르겠습니다.
해결책?
ping google.com | grep --line-buffered '.'
또는
ping google.com | stdbuf --output=L grep '.'
이에 따르면답변SO에서는 출력 버퍼가 아직 가득 차지 않아 출력이 표시되지 않을 수 있습니다. 이는 프로그램이 종료된 후에도 출력이 표시되지 않는 이유를 설명합니다.