えいのうにっき

a-knowの日記です

systemd で動くプログラムの標準出力をファイルに出力させたい

昨年末に Go言語で書いた Web アプリケーションの習作をサービス化して公開するところまでやってみた - えいのうにっき https://blog.a-know.me/entry/2017/12/26/234528 で公開したサービス・Yukizuri のデーモン化手段を、今日、supervisor から systemd に変更した。理由は単純で、会社の同僚(先輩)と「なんで supervisor 使ったの?」「今なら systemd がいいんじゃない?」といったような会話があったため(別に咎められたわけではない)。

今まで supervisor で以下のような指定をして動かしていたものを、

; for yukizuri
[program:yukizuri]
command=/var/www/yukizuri/app/yukizuri.bin -addr=":8080" -logging=true
autostart = true
startsecs = 1
user = root
redirect_stderr = true
stdout_logfile = /var/www/yukizuri/log/production.log

systemd に切り替えるにあたり、以下のようにした。

[Unit]
Description=Yukizuri service

[Service]
Type=simple
ExecStart=/bin/sh -c 'exec /var/www/yukizuri/app/yukizuri.bin -addr=":8080" -logging=true > /var/www/yukizuri/log/production.log'
ExecStop=/bin/kill -SIGTERM $MAINPID
ExecReload=/bin/kill -SIGTERM $MAINPID && /bin/sh -c 'exec /var/www/yukizuri/app/yukizuri.bin -addr=":8080" -logging=true > /var/www/yukizuri/log/production.log'
Restart = always

[Install]
WantedBy = multi-user.target

と、結論だけみると「ふーん」という感じなのだけど、ここに至るまでに少し紆余曲折があった。

続きを読む