systemd 서비스에서 쉘 명령을 실행하면 결과를 기록하는 방법은 무엇입니까?

systemd 서비스에서 쉘 명령을 실행하면 결과를 기록하는 방법은 무엇입니까?

nodejs를 사용하여 mysqlwifi.js를 시작하는 서비스가 있습니다.

$ cat /lib/systemd/system/mysqlwifi.service;

 [Unit]
 Description=MySQL exampledb update
 After=multi-user.target
 After=network-online.target
 Wants=network-online.target

 [Service]
 Type=idle
 Restart=always
 RestartSec=6
 ExecStart=/usr/bin/node /home/dietpi/node_server/mysqlwifi.js > /home/dietpi/node_server/mysqlwifi.log 2>&1

 [Install]
 WantedBy=multi-user.target

node /home/dietpi/node_server/mysqlwifi.js를 터미널에서 직접 실행하면 쉘에 출력이 표시됩니다.

답변1

systemd문제는 의 명령문 ExecStart=내에서 쉘 redicet을 사용 하려고 한다는 것입니다 . 이 셸 동작은 systemd서비스 단위 로 직접 전송될 수 없습니다 .


옵션 1:모두 쉘 스크립트에 작성하고 실행되는 명령을 변경하십시오.

 #my_script
 #!/bin/bash
 /usr/bin/node /path/to/script.js  >>/path/to/logfile 2>&1

StartExec=/path/to/my_script.sh(실행 가능 비트 설정)을 사용합니다 .


옵션 2: 유닛 파일에서 다음을 사용하여 스트림을 수동으로 리디렉션합니다(인용하다):

 ExecStart=/usr/bin/node /path/to/script.js
 StandardOutput=file:/path/to/logfile
 StandardError=file:/path/to/logfile

위의 참조에서 언급한 대로 StardardOutput=append:/path/to/logfile파일을 덮어쓰는 대신 추가하는 데 사용됩니다 (동일).StandardError


옵션 3: systemd나만의 로그 서비스를 사용하세요systemd-journald

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mysqlwifi

노트syslog: 단위 이름을 사용하는 것 stdout뿐만 아니라 단위 이름을 식별자로 사용하는 것이 표준 동작이므로 이 세 가지를 설정하는 것은 실제로 필요하지 않습니다. stderr이는 단지 명확성을 위한 것입니다.

아마도 로그가 메모리 대신 디스크 저장소에 기록되어 영구적인 기록을 갖도록 Storage=persistent설정할 수 있습니다 . /etc/systemd/journald.conf(디스크 사용량을 확인하거나 conf 파일에서 제한을 설정하세요 SystemMaxFileSize=. 자세한 내용은여기)

통화 기록이 통과되었습니다 journalctl -u mysqlwifi.

관련 정보