如果来自 systemd 服务的 shell 命令如何记录结果?

如果来自 systemd 服务的 shell 命令如何记录结果?

我有这个使用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 我确实会在 shell 中看到输出

答案1

问题是,您正在尝试在systemd'sExecStart=语句中使用 shell redicet。此 shell 行为不能直接转移到systemd服务单元。


选项1:将其全部写入 shell 脚本并更改执行的命令:

 #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.

相关内容