まあ、私はsystemctlで構成されたサービスを持っています。これは設定ファイルです:
_[Unit]
Description=The description of the service (:
After=network.target
[Service]
ExecStartPre=/bin/echo 'Starting Service' >> /var/log/node/myapp.log
ExecStart=/root/.nvm/versions/node/v5.0.0/bin/node ./bin/www
ExecStopPost=/bin/echo 'Stopping Service' >> /var/log/node/myapp.log
Restart=always
#StandardOutput=/var/log/node/myapp.log
#StandardError=/var/log/node/myapp.log
SyslogIdentifier=myapp
Environment=NODE_ENV=production
WorkingDirectory=/home/user/node-apps/theapp
[Install]
WantedBy=multi-user.target
_
必要なもの:
1)ExecStartPre
およびExecStopPost
は、メッセージ_'starting service'
_または_'stopping service'
_をファイル_/var/log/node/myapp.log
_に書き込むことができます。上記の設定では機能せず、_'Starting Service' >> /var/log/node/myapp.log
_と_'Stopping Service' >> /var/log/node/myapp.log
_をjournalctl
に出力するだけです。 (_journalctl -u myapp
_で確認しました)
2)アプリのすべてのログの代わりに、journalctl
への出力がファイルに出力できることが必要です。例:_/var/log/node/myapp.log
_。つまり、アプリにconsole.log()
がある場合、そこにある可能性があります。
pstartを使用すると、次のように実行できます。
_script
exec start-stop-daemon --start --make-pidfile --pidfile /var/run/upstart-yourapp.pid --chdir /var/www/yourapp/--chuid user:usergroup --exec /usr/bin/node index.js >> /var/log/yourapp.upstart.log 2>&1
end script
pre-start script
# Date format same as (new Date()).toISOString() for consistency
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/yourapp.upstart.log
end script
post-stop script
rm /var/run/upstart-ghost.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/yourapp.upstart.log
end script
_
しかし、それはsystemctl?
同様の問題が発生しました。説明したように here は、ExecStartPre
、ExecStart
、またはExecStopPost
コマンド内で出力を直接リダイレクトできないことが判明しました-systemdは、 >
または>>
を引数として。解決策は、sh -c
を使用してコマンドを実行することです。
Systemdスクリプトでdate
コマンドを使用しようとしたときに発生した他の問題が1つあります。%m
は、現在のホストのマシンIDを参照する特別なコードです。したがって、月を出力するには、2つのパーセント記号(%%
)を使用してパーセント記号をエスケープする必要があります。以上をまとめると、上記のプレスクリプトとポストスクリプトのsystemdバージョンは次のようになります。
# Date format same as (new Date()).toISOString() for consistency
ExecStartPre = /bin/sh -c 'echo "[`date -u +%Y-%%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/yourapp.upstart.log'
ExecStopPost = /bin/sh -c 'rm /var/run/upstart-ghost.pid; echo "[`date -u +%Y-%%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/yourapp.upstart.log'