2

一度に 1 つのインスタンスしか実行されず、init.d スクリプトで起動できる、永遠に実行されるプログラムを作成したいと考えています。python-daemonはPEP 3143のリファレンス実装であるため、これを行うのに適しているようです。

とにかく、プログラムが 2 回実行されるのを防げないので、PID ロック ファイルの目的がわかりません。

init.d スクリプト (「/etc/init.d/skeleton」に基づく) でロック ファイルの存在を手動で確認する必要がありますか? また、どうすればそれを殺すことができますか? PID ファイルで PID 番号を取得し、SIGTERM ? を送信します。

どうもありがとう。

4

2 に答える 2

1

現在サイトがダウンしている Sander Marechal のコードを使用することになったので、ここにペーストビンへのリンクがあります: http://pastebin.com/FWBUfry5

以下に、それを使用する方法の例を示します。これは、私が期待した動作を生成します。2 つのインスタンスを開始することはできません。

    import sys, time
    from daemon import Daemon


    class MyDaemon(Daemon):
            def run(self):
                    while True:
                            time.sleep(1)

    if __name__ == "__main__":
            daemon = MyDaemon('/tmp/daemon-example.pid')
            if len(sys.argv) == 2:
                    if 'start' == sys.argv[1]:
                            daemon.start()
                    elif 'stop' == sys.argv[1]:
                            daemon.stop()
                    elif 'restart' == sys.argv[1]:
                            daemon.restart()
                    else:
                            print "Unknown command"
                            sys.exit(2)
                    sys.exit(0)
            else:
                    print "usage: %s start|stop|restart" % sys.argv[0]
                    sys.exit(2)
于 2014-02-25T08:16:27.620 に答える
0

私にとっては、PID ファイルを介して 2 番目のインスタンスが開始されるのを効果的に防ぎます。正しく使用していますか?私の例は、PEP 3143 リファレンスとソースで見つけたものに基づいています。

#!/usr/bin/env python

import daemon, os, time, lockfile

with daemon.DaemonContext(
    pidfile=lockfile.FileLock('./pydaemon.pid'),
    working_directory=os.getcwd()):
  for i in range(10):
    with open('./daemon.log', 'a') as logFile:
      logFile.write('%s %s\n' % (os.getpid(), i))
    time.sleep(1)

一度起動すると、PID ロック ファイルが作成されます。2 度目に起動すると、2 番目のインスタンスは最初のインスタンスが終了するまでスリープ状態になります。通常のデーモンは終了しないため、これにより 2 番目のインスタンスが効果的にブロックされます。ただし、最初のデーモンが終了すると、2 番目のデーモンが開始されます。

于 2014-02-24T15:02:04.283 に答える