2

MySQLから取得したデータのグラフを作成する小さなPythonスクリプトがあります。定期的にスクリプトをバックグラウンドで実行する方法を見つけようとしています。私はいくつかのことを試しました:

  1. スクリプトを実行するcronジョブ
  2. ループタイマー
  3. &コマンドを使用してバックグラウンドでスクリプトを実行する

これらにはすべて長所と短所があります。

  1. 30分ごとに実行されるCronジョブは、価値があるよりも多くのリソースを消費しているようです。
  2. スクリプトに配置されたループタイマーは、実際にはスクリプトをバックグラウンドに配置せず、実行を継続します。
  3. Linuxとコマンドはプロセスをバックグラウンドで実行しますが、実際のLinuxサービスとは異なり、強制終了せずに再起動/停止することはできません。

誰かが私にこれらすべての方法を最大限に活用する方法を教えてもらえますか?

4

2 に答える 2

11

スクリプトを適切なデーモンにしようとしないでください。このリンクから始めるのが良いでしょう。

import os
import subprocess
import time
from daemon import runner

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/your-pid-name.pid'
        self.pidfile_timeout = 5
    def run(self):

        try:
            while True:

                ### PUT YOUR SCRIPT HERE ###

                time.sleep(300)

        except Exception, e:
            raise

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

このスクリプトは、他のLinuxサービスと同じように開始/停止/再起動できます。

于 2012-06-07T01:00:01.050 に答える
3

シェルアプローチでは開始するために手動の介入が必要になるため、cronジョブはおそらく一般的には良いアプローチです。

いくつかの提案:

ロックファイルを使用して、cronジョブがPythonスクリプトの1つのインスタンスのみを開始するようにすることができます。最初のインスタンスが実際に終了する前に2番目のインスタンスを開始するため、より大きなジョブにcronを使用すると問題が発生することがよくあります。これを行うには、ロックファイルが存在するかどうかを確認し、存在しない場合は、スクリプトの最初でファイルを「タッチ」し、スクリプトの最後で最後のアクションとして「rm」します。ロックファイルが存在する場合は、すでに1つのインスタンスが実行されているため、スクリプトを終了するだけです。(もちろん、スクリプトが停止した場合は、スクリプトを再度実行する前にロックファイルを削除する必要があります)。

また、リソースの過度の使用が問題になる場合は、優先度を低くすることで、スクリプトが多くのリソースを消費しないようにすることができます(たとえば、nice -n 19のプレフィックス)。

于 2012-06-07T01:03:57.640 に答える