systemd 서비스의 stdout/stderr 보기

systemd 서비스의 stdout/stderr 보기

사용자 정의 애플리케이션을 위한 간단한 시스템 서비스 파일을 만들었습니다. 수동으로 실행하면 애플리케이션이 제대로 실행되지만 systemd를 사용하여 실행하면 CPU가 소모됩니다.

문제가 무엇인지 알아내려고 노력하고 있지만 출력을 어디서 찾을 수 있는지(또는 출력을 어딘가에 넣도록 systemd를 구성하는 방법) 모르겠습니다.

이것은 내 서비스 파일입니다.

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

애플리케이션 전체에서 stdout 및 stderr로 출력했습니다.

데몬의 출력을 읽는 방법은 무엇입니까?

편집하다:

을 찾았는데 man systemd.exec해당 StandardOutput=옵션이 언급되어 있지만 사용 방법을 잘 모르겠습니다. ~에서매뉴얼 페이지:

StandardOutput=

실행된 프로세스의 파일 설명자 1(STDOUT)이 연결되는 위치를 제어합니다. 그 중 하나를 가져가라상속하다,유효하지 않은,단말기,시스템 로그,킬로미터 정보,킬로미터 메시지 + 콘솔,시스템 로그 + 콘솔또는소켓.

로 설정한 경우상속하다표준 입력에 대한 파일 설명자는 표준 출력에 복사됩니다. 로 설정한 경우유효하지 않은표준 출력은 에 연결됩니다 /dev/null. 즉, 여기에 기록된 모든 내용이 손실됩니다. 로 설정한 경우단말기표준 출력은 tty에 연결됩니다(다음으로 구성됨).TTYPath=, 아래 참조). 출력을 위해 TTY만 사용하는 경우 실행 프로세스는 터미널을 제어하는 ​​프로세스가 되지 않으며 다른 프로세스가 터미널을 해제할 때까지 실패하거나 기다리지 않습니다. 시스템 로그표준 출력을 syslog(3) 시스템 로거에 연결합니다. 킬로미터 정보이것을 dmesg(1)를 통해 액세스할 수 있는 커널 로그 버퍼와 연결합니다. 시스템 로그 + 콘솔그리고킬로미터 메시지 + 콘솔유사하게 작동하지만 출력을 시스템 콘솔에 복사하기도 합니다. 소켓소켓 활성화에서 해당 옵션과 유사한 의미를 사용하여 표준 출력을 소켓에 연결합니다.StandardInput=. 이 설정의 기본값은 상속입니다.

이것은 이것이 나의 유일한 선택이라는 것을 의미합니까? 예를 들어, 입력 출력 /dev/shm등을 원합니다 . 나는 Unix 도메인 소켓을 사용하고 간단한 리스너를 작성할 수 있다고 생각하지만 그것은 약간 불필요한 것 같습니다.

디버깅을 위해서만 이것이 필요하며 결국 대부분의 로그를 제거하고 출력을 syslog로 변경하게 될 수 있습니다.

답변1

고쳐 쓰다

McMakana가 지적했듯이,시스템 로그이제 대부분의 배포판에 대한 표준 로깅 기능입니다. stdout시스템 단위의 합계를 보려면 다음을 사용하세요.stderrjournalctl주문하다.

sudo journalctl -u [unit]

원래 답변

기본적으로 stdout시스템 단위의 합계는 syslog로 전송됩니다.stderr

전체 systemd를 사용하는 경우 를 통해 액세스할 수 있습니다 journalctl. Fedora에서는 그렇게 되어야 /var/log/messages하지만 syslog는 규칙이 지시하는 곳에 이를 배치합니다.

게시물 날짜로 인해 대부분의 사람들이 Fedora를 통해 systemd에 노출된다고 가정하면 여기에 설명된 오류가 발생할 수 있습니다. https://bugzilla.redhat.com/show_bug.cgi?id=754938 또한 그것이 어떻게 작동하는지 아주 잘 설명합니다 =) (이것은 오류 메시지가 기록되지 않는 selinux-policy의 버그였으며 에서 수정되었습니다 selinux-policy-3.10.0-58.fc16.)

답변2

더 짧고 간단하며 레거시가 아닌 답변:

sudo journalctl -u [unitfile]

여기서 [unitfile]은 시스템 .service이름입니다. 예를 들어 다음 에서 myapp.service보낸 메시지를 보려면

sudo journalctl --unit=myapp

실시간 추적 로그:

sudo journalctl -f -u myapp

관련 정보