사용자 정의 애플리케이션을 위한 간단한 시스템 서비스 파일을 만들었습니다. 수동으로 실행하면 애플리케이션이 제대로 실행되지만 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
시스템 단위의 합계를 보려면 다음을 사용하세요.stderr
journalctl
주문하다.
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