체계적인 서비스의 표준 출력 / 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 + console 및 kmsg + 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+console그 StandardError=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.