사용자 지정 응용 프로그램을위한 간단한 시스템 서비스 파일을 만들었습니다. 응용 프로그램은 수동으로 실행할 때 잘 작동하지만 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/messages
속임수를 쓴다 . 문제는 로그에 따르면 내 데몬이 시작할 때 충돌하지만 HTTP 서버가 있기 때문에 여전히 실행 중임을 알 수 있으며 쿼리 할 수 있습니다. 로그의 나머지 부분을 잃어버린 것 같습니다 ...
StandardOutput=tty
데몬을 시작할 때 무슨 일이 일어나고 있는지 확인할 수 있도록 설정을 시도해 보지 않겠습니까? 터미널을 출력해야 ttyS0
합니다 (화면에 출력을 얻으려면 사용 하거나 유사 해야 할 수도 있음 ).
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslog
출력 확인 을 시도 했습니까 ? 대부분의 시스템은 로그인을/var/log/
해서 시작합니다.grep
출력을 알고 있다면 텍스트를 검색 하는 데 사용할 수 있습니다grep "my output" /var/log
.