it-swarm-ko.tech

체계적인 서비스의 표준 출력 / 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=를 찾았지만 사용법을 잘 모르겠습니다. man page 에서 :

StandardOutput=

실행 된 프로세스의 파일 디스크립터 1 (STDOUT)이 연결되는 위치를 제어합니다. 상속, null, tty, syslog, kmsg,-중 하나를 사용합니다. kmsg + console, syslog + console 또는 socket.

inherit으로 설정된 경우 표준 입력의 파일 디스크립터가 표준 출력에 복제됩니다. null으로 설정하면 표준 출력이 /dev/null에 연결됩니다. 즉, 작성된 모든 내용이 손실됩니다. tty으로 설정하면 표준 출력이 tty에 연결됩니다 (TTYPath=를 통해 구성된대로 아래 참조). TTY가 출력에만 사용되면 실행 된 프로세스는 터미널의 제어 프로세스가되지 않으며 다른 프로세스가 터미널을 해제하기를 기다리거나 기다리지 않습니다. syslog 표준 출력을 syslog (3) 시스템 로거에 연결합니다. kmsg dmesg (1)을 통해 액세스 할 수있는 커널 로그 버퍼에 연결합니다. syslog + consolekmsg + console 비슷하게 작동하지만 출력을 시스템 콘솔에도 복사하십시오. socket ​​소켓 활성화에서 표준 출력을 소켓에 연결합니다. 시맨틱은 StandardInput= 옵션과 유사합니다. 이 설정은 기본적으로 상속됩니다.

이것이 이것이 나의 유일한 옵션이라는 것을 의미합니까? 예를 들어, 출력을 /dev/shm 또는 다른 것에 넣고 싶습니다. 유닉스 도메인 소켓을 사용하고 간단한 리스너를 작성할 수 있다고 가정하지만 약간 불필요합니다.

디버깅을 위해이 기능이 필요하며 대부분의 로그를 제거하고 출력을 syslog로 변경합니다.

196
beatgammit

최신 정보

Mikemaccana가 지적한 것처럼 systemd journal 은 이제 대부분의 배포판에 대한 표준 로깅 장치입니다. 시스템 장치의 stdoutstderr를 보려면 journalctl 명령을 사용하십시오.

Sudo journalctl -u [unit]

원래 답변

기본적으로 시스템 단위의 stdoutstderr는 syslog로 전송됩니다.

전체 시스템을 사용하는 경우 journalctl를 통해 액세스 할 수 있습니다. Fedora에서는 /var/log/messages 그러나 syslog는 규칙이 말하는 곳에 넣습니다.

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

201
Matt

더 짧고 간단한 레거시 대답 :

Sudo journalctl -u [unitfile]

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

Sudo journalctl --unit=myapp

실시간으로 로그를 따라 가려면 :

Sudo journalctl -f -u myapp
90
mikemaccana