체계적인 서비스의 표준 출력 / stderr보기


175

사용자 지정 응용 프로그램을위한 간단한 시스템 서비스 파일을 만들었습니다. 응용 프로그램은 수동으로 실행할 때 잘 작동하지만 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 페이지 :

StandardOutput=

실행 된 프로세스의 파일 디스크립터 1 (STDOUT)이 연결되는 위치를 제어합니다. 중 하나를 취 상속 , 널 (null) , 청각 장애 , 시스템 로그 , kmsg를 , kmsg를 + 콘솔 , 시스템 로그 + 콘솔 또는 소켓 .

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

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

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


/var/log/syslog출력 확인 을 시도 했습니까 ? 대부분의 시스템은 로그인을 /var/log/해서 시작합니다. grep출력을 알고 있다면 텍스트를 검색 하는 데 사용할 수 있습니다 grep "my output" /var/log.
sbtkd85

@ sbtkd85-글쎄, 나는 /var/log/syslog없지만 /var/log/messages속임수를 쓴다 . 문제는 로그에 따르면 내 데몬이 시작할 때 충돌하지만 HTTP 서버가 있기 때문에 여전히 실행 중임을 알 수 있으며 쿼리 할 수 ​​있습니다. 로그의 나머지 부분을 잃어버린 것 같습니다 ...
beatgammit

StandardOutput=tty데몬을 시작할 때 무슨 일이 일어나고 있는지 확인할 수 있도록 설정을 시도해 보지 않겠습니까? 터미널을 출력해야 ttyS0합니다 (화면에 출력을 얻으려면 사용 하거나 유사 해야 할 수도 있음 ).
sbtkd85

3
이 맥락에서 표준 IO 리디렉션 연산자가 작동하지 않아야합니다. 뭔가 같은ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
디팍 미탈

실제로 CPU를 남용하는 것은 무엇입니까? 시스템, 서비스 또는 시스템이 체계화되어 있습니까 (예 : systemd가 미쳐서 서비스의 새 사본을 생성하여)?
peterph

답변:


183

최신 정보

mikemaccana가 지적했듯이, 시스템 저널 은 이제 대부분의 배포판에서 표준 로깅 장치입니다. stdout및 시스템 stderr장치 를 보려면 명령을 사용하십시오 journalctl.

sudo journalctl -u [unit]

원래 답변

기본적으로 stdout하고 stderrsystemd 유닛은 syslog에 전송됩니다.

전체 시스템을 사용하는 경우을 통해 액세스 할 수 있습니다 journalctl. Fedora에서는 /var/log/messagessyslog가 있어야 하지만 규칙에 명시된 위치에 배치 해야합니다 .

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


5
이와 같은 표준 로깅 메커니즘을 사용하면 기본적으로 영구 로그가 생성 되지 않습니다 . 이렇게하려면 / var / log / journal을 만든 다음 다음을 실행해야합니다.sudo systemctl restart systemd-journald
mlissner

1
어떤 syslog 기능과 우선 순위?
jrwren

2
이것은 나를 위해 일했습니다 : StandardOutput=syslog+consoleStandardError=syslog+console후 내 장치의 모든 출력은 journalctl에 나타났습니다. 기본 설정이 잘못되었습니다. (/etc/systemd/system.conf의 DefaultStandardOutput과 동일)
gregn3

2
-f나를 위해 도움이되었습니다. 변화가 발생할 때 (사용 사례가 데몬으로 실행중인 마인 크래프트 서버를 다음되었다) 로그를 이어
blaughw

2
이것은 나를 미치게합니다 ... 표준 데비안 스트레치 저널에서 표준 출력을 보여주지 않습니다. 나는 심지어 /usr/bin/stdbuf -oL <cmd>명시 적 사용 StandardOutput=journal합니다. 여전히 아무것도 없습니다.
jlh

81

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

sudo journalctl -u [unitfile]

여기서 [unitfile]은 시스템 .service이름입니다. 예를 들면, 메시지에서 볼 수 myapp.service,

sudo journalctl --unit=myapp

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

sudo journalctl -f -u myapp

4
오류가 발생 sudo하면 해야 할 수도 있습니다 No journal files found.
bigjosh

5
syslog는 레거시가 아닙니다 ...
Miles Rout 5

2
현재 Linux 배포판에 있습니다. syslog를 좋아할 수도 있지만 제공되는 내용은 변경되지 않습니다.
mikemaccana 2016 년

1
확실한. 또한 syslog도 사용합니다. 내 요점은 systemd가 사용되지 않지만 syslog는 레거시가 아니라는 것입니다.
미로

6
@JECompton 현재 Linux 배포판의 모든 로깅이 저널링을 사용하고 syslog가 필요하지 않으며 호환성을 위해서만 사용되는 경우 논리적으로 syslog가 레거시임을 따릅니다.
mikemaccana
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.