CentOS7でのnodeプロセスの永続化

foreverを使っていたのだけど、メンテされていないし、CentOS7ではsystemd化したほうがよさげなので変更。
systemdなので、ターミナルからプロセスの切り離し、マシン再起動による自動起動、プロセスダウンによる自動再起動ができるのはわかる。
しかし、ログはどうなる?実行権限を合わせておく必要ある?nodeモジュールの実行パスはどこに?という疑問があった。どれも適度に解決できた。

# vi /usr/lib/systemd/system/udp.service
[Unit]
Description=UDP Server
After=syslog.target network.target

[Service]
# Type=simple
ExecStart=/bin/node /usr/local/node/udp.js
# WorkingDirectory=/usr/local/node
KillMode=process
Restart=always
# RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rl3udp
User=node
Group=node
Environment=NODE_ENV=production NODE_PATH=/usr/lib/node_modules

[Install]
WantedBy=multi-user.target
  • 自動起動登録:# systemctl enable udp.service
  • 起動:# systemctl start udp.service
  • 終了:# systemctl stop udp.service
  • 再起動:# systemctl restart udp.service
  • 状態:# systemctl status udp.service
  • logの状態:# journalctl -u udp.service
  • 再起動テスト:statusでPID調べてKILLし、再起動するか確認。問題なし。

foreverではログ吐く時にタイムスタンプ打ってくれなかったので、console.log()で吐いてたのをやめる。


CentOS7では、ログ管理はjournaldになっている。
コマンドでいろいろできるので便利なんだけど、多すぎるログに対処するのはめんどくさい。
journalctlのオプションおぼえるのもめんどくさい。
/var/log/journalはないので永続化されていない。リブートしたらtmpfsなので消えてしまう。
ディレクトリ作ったら、tmpfsから自動でファイルに移動するみたいだけど、それもなんなので明示で設定する。

# vi /etc/systemd/journald.conf
[Journal]
Storage=persistent
SystemMaxUse=1G
# systemctl restart systemd-journald

ログサイズはあふれたら追い出される感じ。ローテーションでアーカイブ保管とかはしてくれない模様。それも困る。
デフォルトで同時にrsyslogも動いていて、journaldからデータを受け取るように設定されているようなので、ログはmessgsに落ちていた。
設定はこれを参照しているのかな。

/etc/rsyslog.d/listen.conf
$SystemLogSocketName /run/systemd/journal/syslog

messgsでもいろいろ混じってやっかいなので、サービスの分だけログを別保存する。

# vi /etc/rsyslog.conf
:msg,contains,'rl3udp' /var/log/udp.log
# systemctl restart rsyslog

ログファイルの前に-を付けるのは非同期フラッグなのだけど、今は付けてはいけないようだ。書式エラーが出ている。


いまのところ、とにかく量を吐いてくれるログなので、ローテーションを適宜設定しないと扱いにくい。

# vi /etc/logrotate.d/udp
/var/log/rl3udp.log {
    daily
    rotate 1825
    copytruncate
	dateext
    delaycompress
    compress
    notifempty
    missingok
}

cronで動いているので、そのまま動くのじゃないかな。
一日放置して、ローテーションしているのを確認。