61664


python でかかれた一定時間ごとに実行したい復数の処理を  
１つの起動スクリプトでデーモン化したいです

[code]

    def a():
      while True:
        sleep(10)
        print('a')
    
[/code]

[code]

    def b():
      while True:
        sleep(10)
        print('b')
    
[/code]

start_daemon.py

[code]

      while True:
        pid = os.fork()
        if pid > 0:
            pid_file = open('/var/run/a.pid', 'w')
            pid_file.write(str(pid)+"\n")
            pid_file.close()
            break
        if pid == 0:
            a()
    
      while True:
        pid = os.fork()
        if pid > 0:
            pid_file = open('/var/run/b.pid', 'w')
            pid_file.write(str(pid)+"\n")
            pid_file.close()
            break
        if pid == 0:
            b()
    
[/code]

こんな感じで２つ並べれば起動はするんですが  
pid ファイルが復数できてしまうのでサービスファイルをどうかけばいいかわかりませんし  
当たり前ですがプロセスも両方きらないと落とせません

ウェブサーバーなんかだとマスタープロセスが子プロセスを復数生み出すようになってて  
マスターをkillすれば子プロセスは全部死ぬとおもうんですが  
python script の復数のメソッドをそんな感じにするにはどうすればいいんでしょうか


CC BY-SA 4.0
2019-12-21T15:10:46.090
61652
2021-07-14T03:16:20.550
2021-07-14T03:16:20.550
3060
question
python linux
復数のプロセスを持つデーモンの作り方


`start_daemon.py` は子プロセスを2つ作ったあと終了しようとしていますが、子プロセスを管理する必要があります。

systemd等のサービスマネージャーには、この `start_daemon.py` のPIDを管理させます。  
サービスマネージャーから停止させるときは、 `start_daemon.py` にTERMシグナルを送信して、 `start_daemon.py` は
[signal.signal](https://docs.python.org/ja/3/library/signal.html#signal.signal)でTERMシグナルをハンドリングして、TERMシグナルが届いたら、2つの子プロセスのPIDに同様にTERMシグナルを送信して停止させてください。

* * *

実際の実装はエラーハンドリングなども含めてもうすこし複雑になると思います。  
定期的に処理を実行するライブラリ [APScheduler](https://pypi.org/project/APScheduler/)
を利用したり、そもそもPythonで定期実行を管理せずにサービスマネージャーに定期的に実行させる方法などもあります。systemdであれば、systemd.timerを設定すればよいと思います。


CC BY-SA 4.0
2019-12-21T22:48:33.210
61664
2019-12-21T22:48:33.210
806
61652
answer