7

私はLinux(www.mosix.org)上のクラスターシステムを使用しており、ジョブを実行して、システムに別のコンピューターで実行させることができます。ジョブは次のように実行されます。

mosrun ls &

これにより、プロセスが自然に作成され、バックグラウンドで実行され、次のようにプロセスIDが返されます。

[1] 29199

後でそれは戻ります。私は、ジョブを実行してそれらを制御するPythonインフラストラクチャを作成しています。そのために、上記のmosrunプログラムを使用してジョブを実行し、生成されたプロセスのプロセスID(この場合は29199)を保存します。印刷されたIDはプロセスが出力に出力するものではないため、これはos.systemまたはcommands.getoutputを使用して行うことはできません...手がかりはありますか?

編集

Pythonスクリプトは最初にスクリプトを実行することだけを目的としているため、スクリプトはPythonシェルよりも長く実行する必要があります。これは、mosrunプロセスをスクリプトの子プロセスにすることはできないことを意味していると思います。助言がありますか?

ありがとう

4

3 に答える 3

3

モジュールを使用しsubprocessます。Popenインスタンスにはpid属性があります。

于 2010-05-21T18:53:52.690 に答える
2

子プロセスがデーモン化されていることを確認したいようです-私が指摘しているPEP 3143は、そのためのリファレンス実装を文書化して指摘し、他のものも指摘しています。

プロセス (まだ Python コードを実行中) がデーモン化されると、それが PEP 3143 などで提供されている手段によって、ターゲット コードをos.execl (または他の関数) にすることができます。デーモン化されていると言ったので、必要に応じてデーモン化され続けます。os.exec...

最後のステップは、同じ(デーモン化された) プロセスで実行する必要があり、実行可能コードをオーバーレイsubprocessする必要があるため、使用できません。os.execl

デーモン化の前の最初のステップは、おそらく 経由subprocessで行われるかもしれませんが、それはやや不便です (daemonize-then-os.exec コードを別の に配置する必要があります.py): 最も一般的にはos.fork、子プロセスをただちにデーモン化するだけです。 .

subprocess他のプロセスを実行するためのほぼクロスプラットフォームの方法としては非常に便利ですが、高度な用途 (この場合はデーモン化など) のための Unix の古き良き「fork and exec」アプローチを実際に置き換えることはできません。 Python 標準ライブラリでは、モジュール内の関数を介して後者を行うこともできますos!-)

于 2010-05-22T15:22:53.330 に答える
0

助けてくれてありがとう。これが私が最終的にやったことであり、うまくいくようです。コードはpython-daemonを使用します。プロセス ID を子プロセスから父親プロセスに転送することについて、もっと賢明な方法を講じる必要があるかもしれませんが、それは簡単な部分です。

import daemon
def run_in_background(command, tmp_dir="/tmp"):

    # Decide on a temp file beforehand
    warnings.filterwarnings("ignore", "tempnam is a potential security")
    tmp_filename = os.tempnam(tmp_dir)

    # Duplicate the process
    pid = os.fork()


    # If we're child, daemonize and run
    if pid == 0:
        with daemon.DaemonContext():
            child_id = os.getpid()
            file(tmp_filename,'w').write(str(child_id))
            sp = command.split(' ')
            os.execl(*([sp[0]]+sp))
    else:
        # If we're a parent, poll for the new file
        n_iter = 0
        while True:
            if os.path.exists(tmp_filename):
                child_id = int(file(tmp_filename, 'r').read().strip())
                break

            if n_iter == 100:
                raise Exception("Cannot read process id from temp file %s" % tmp_filename)
            n_iter += 1

            time.sleep(0.1)

        return child_id
于 2010-05-25T13:40:33.623 に答える