以前にSystemdとinit.dの書き方の違いとして記事を書きました。
実は前回、init.dの時に作成していたコードをそのままSystemdに差し替えるという意図があり、init.dでもSystemdでも使えるようにPythonコードをforkしてPIDを生成しました。Systemdのサービス設定ではそのPythonコードから生成されたPIDを利用するようにしていたのですがSystemdだけで利用する場合はもっと簡単!
Pythonコードの中でforkは要らない!単なるPythonコードでOKです。(比較は前回記事をご参照ください。)
-- sampled.py --
import os
import time
def sample():
while 1:
time.sleep(5)
print "sample-daemon"
if __name__=='__main__':
sample()
5秒ごとに「sample-daemon」と出力するだけのプログラム。
Systemdの場合は前回のfork部分を書かなくてもSystemdがイイ感じにPID(プロセスID)を割り振って管理してくれるのです!
方法は
/usr/local/lib/sampled.py
というpythonファイルがあるとして、それをデーモン化するには
/usr/lib/systemd/system/
の中に
sampled.service
というテキストファイルを生成。
”/usr/lib/systemd/system/sampled.service” の中身は
[Unit]
Description=sample daemon[Service]
ExecStart=/usr/local/lib/sampled.py
Restart=always
Type=simple[Install]
WantedBy=multi-user.target
とするだけ。
前回の記事ではServiceの項目に
[Service]
ExecStart=/usr/local/lib/sampled.py
Restart=always
Type=forking
PIDFile=/var/run/sampled.pid
PIDFileにPIDの保存ファイルを明確に書いていましたが、今回は
”Type=simple”
だけ。これでPIDを勝手に生成して管理してくれるようです。Systemd便利ですねー。
あとはデーモンをリロードしてスタートさせて、動作確認OKであればイネーブルするというのは前回同様↓。
サービスの再読み込みをする。
sudo systemctl daemon-reload
サービスをスタート
sudo systemctl start sampled
動いているか確認
systemctl status sampled
システム起動時に自動的に実行させる
sudo systemctl enable sampled
起動時に実行する設定が有効かチェックする
systemctl is-enabled sampled
起動時に実行する設定を取り消す
systemctl disable sampled
その他systemdの使い方参考サイト