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で動いているので、そのまま動くのじゃないかな。
一日放置して、ローテーションしているのを確認。