2

いくつかのファイルを生成し、ビデオ画像やその他のものを保存するループ付きのpythonアプリがあります。Fedora(17)PCにインストールし、「永久に」実行したい、つまりハングした場合(ループ内のファイルにkeep_aliveを入れることができます)、再起動する必要があります。また、再起動時に開始する必要があります。私が理解しているように、python-daemon はこれを行うのに役立ち、Fedora では systemd です。systemd 用の次の構成ファイルがあります (一部のパラメーターについてはわかりませんが、私の Linux 知識のレベルではドキュメントが複雑すぎるためです)。

[Unit]
Description=TPR Daemon

[Service]
Type=forking
Restart=always
WorkingDirectory=/home/igor/tpr
PIDFile=/var/run/tpr.pid
ExecStart=/usr/bin/python /home/igor/tpr/testd.py

[Install]
WantedBy=default.target

ここに私のtestd.pyがあります:

import daemon
import time, sys

class MyDaemon(object):
    def __init__(self):
        pass

    def run(self):
        while True:
            print 'I am alive!'
            time.sleep(1)

if __name__ == '__main__':
    with daemon.DaemonContext(stdout=sys.stdout):
        check = MyDaemon()
        check.run()

「sudo systemctl start tpr.service」で実行すると、しばらくハングしてから、次のメッセージでキャンセルされます。

警告: tpr.service のユニット ファイルがディスク上で変更されました。'systemctl --system daemon-reload' をお勧めします。tpr.service のジョブが失敗しました。詳細については、「systemctl status tpr.service」および「journalctl -xn」を参照してください。

/var/log/messages からのログは次のとおりです。

Aug  9 21:32:27 localhost systemd[1]: Unit tpr.service entered failed state.
Aug  9 21:32:27 localhost systemd[1]: tpr.service holdoff time over, scheduling restart.
Aug  9 21:32:27 localhost systemd[1]: Stopping TPR Daemon...
Aug  9 21:32:27 localhost systemd[1]: Starting TPR Daemon...
Aug  9 21:33:57 localhost systemd[1]: tpr.service operation timed out. Terminating.
Aug  9 21:33:57 localhost python[28702]: I am alive!
Aug  9 21:33:57 localhost python[28702]: I am alive!
Aug  9 21:33:57 localhost python[28702]: I am alive!
Aug  9 21:33:57 localhost python[28702]: I am alive!
...
Aug  9 21:33:57 localhost python[28702]: I am alive!
Aug  9 21:33:57 localhost python[28702]: I am alive!
Aug  9 21:33:57 localhost python[28702]: I am alive!
Aug  9 21:33:57 localhost python[28702]: I am alive!
Aug  9 21:33:57 localhost systemd[1]: tpr.service: control process exited, code=exited status=1
Aug  9 21:33:57 localhost systemd[1]: Failed to start TPR Daemon.
Aug  9 21:33:57 localhost systemd[1]: Unit tpr.service entered failed state.
Aug  9 21:33:57 localhost systemd[1]: tpr.service holdoff time over, scheduling restart.
Aug  9 21:33:57 localhost systemd[1]: Stopping TPR Daemon...
Aug  9 21:33:57 localhost systemd[1]: Starting TPR Daemon...

実行されているはずですが、このエラーは何ですか?そして、おそらく私の仕事を達成するための簡単で便利な方法があり、自転車を発明していますか?

アップデート:

デーモンは何らかの方法で systemd に起動したことを知らせる必要があるようです..しかし、どのように?

Aug 10 01:15:36 localhost systemd[1]: Starting TPR Daemon...
Aug 10 01:17:06 localhost systemd[1]: tpr.service operation timed out. Terminating.
Aug 10 01:17:06 localhost systemd[1]: tpr.service: control process exited, code=exited status=1
Aug 10 01:17:06 localhost systemd[1]: Failed to start TPR Daemon.
Aug 10 01:17:06 localhost systemd[1]: Unit tpr.service entered failed state.
Aug 10 01:17:06 localhost systemd[1]: tpr.service holdoff time over, scheduling restart.
Aug 10 01:17:06 localhost systemd[1]: Stopping TPR Daemon...
Aug 10 01:17:06 localhost systemd[1]: Starting TPR Daemon...
Aug 10 01:18:36 localhost systemd[1]: tpr.service operation timed out. Terminating.
Aug 10 01:18:36 localhost systemd[1]: tpr.service: control process exited, code=exited status=1
Aug 10 01:18:36 localhost systemd[1]: Failed to start TPR Daemon.
Aug 10 01:18:36 localhost systemd[1]: Unit tpr.service entered failed state.
Aug 10 01:18:36 localhost systemd[1]: tpr.service holdoff time over, scheduling restart.
Aug 10 01:18:36 localhost systemd[1]: Stopping TPR Daemon...
Aug 10 01:18:36 localhost systemd[1]: Starting TPR Daemon...
4

1 に答える 1

3

ディスク上の変更に関するエラーは、ファイルが変更されたことを意味します。実行後systemctl daemon-reload、ファイルが再読み込みされ、サービスを開始できるようになります。このマニュアルページに記載されているように、通知を使用できます。サービスのタイプは ですnotify。次は、サービスの種類をforking. あなたのプロセスは本当にフォークしますか? PIDfileフォークを使用する場合は、オプションを設定することをお勧めします。systemd では、プロセスを fork してデーモンにする必要はありません。

于 2013-08-10T20:30:31.227 に答える