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=内でシェルredecetを使用しようとしていることです。このシェルの動作は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


オプション3systemd独自のログサービスを使用してくださいsystemd-journald

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mysqlwifi

ノートsyslog:単位名を使用するだけstdoutでなく、単位名を識別子として使用するのが標準的な動作であるため、これら3つを設定することは実際には必要ありません。stderrこれは単に明確さのためです。

おそらく、ログはメモリの代わりにディスクストレージに書き込まれ、永続的な記録を持つようにStorage=persistent設定できます。/etc/systemd/journald.conf(ディスク使用量を確認するか、confファイルで制限を設定してくださいSystemMaxFileSize=。詳しくはここ)

通話履歴が通過しましたjournalctl -u mysqlwifi

関連情報