DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

SystemdでPythonコードをデーモン化してプログラムを常時起動させる

以前にSystemdとinit.dの書き方の違いとして記事を書きました。 

dreamerdream.hateblo.jp

 

実は前回、init.dの時に作成していたコードをそのままSystemdに差し替えるという意図があり、init.dでもSystemdでも使えるようにPythonコードをforkしてPIDを生成しました。Systemdのサービス設定ではそのPythonコードから生成されたPIDを利用するようにしていたのですがSystemdだけで利用する場合はもっと簡単!

f:id:DreamerDream:20180531151925p:plain

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便利ですねー。

f:id:DreamerDream:20180531152011p:plain

 

あとはデーモンをリロードしてスタートさせて、動作確認OKであればイネーブルするというのは前回同様↓。

 

 

サービスの再読み込みをする。

sudo systemctl daemon-reload

サービスをスタート

sudo systemctl start sampled

動いているか確認

systemctl status sampled

システム起動時に自動的に実行させる

sudo systemctl enable sampled

起動時に実行する設定が有効かチェックする

systemctl is-enabled sampled

起動時に実行する設定を取り消す

systemctl disable sampled

その他systemdの使い方参考サイト

systemd - ArchWiki

 

kampa.me