1

プログラムの結果を待たずに終了するSSHコマンドによってリモートで呼び出されるプログラムを実行するためのラッパースクリプトを探しています。

これが私のコードです:

#!/usr/bin/python

import sys
import os, subprocess

def main():
   print "PID_last_child", os.getpid()
   argpass = ['main_p.py']
   for a in sys.argv:
        if a.find("wrapper.py") == -1: 
            argpass.append(a)
   pid = subprocess.Popen(argpass).pid
   print "PID for the actual process: ", pid


if __name__ == "__main__":

  print "PID_MAIN:", os.getpid()

  try: 
         pid = os.fork() 
         print "FORK1: ", pid 
         if pid > 0: 
               sys.exit(0)
   except OSError, e:  
         print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror)
         sys.exit(1)

   os.chdir('/') 
   os.setsid()
   os.umask(0) 

   try:
         pid = os.fork() 
         print "FORK2: ", pid 
         if pid > 0: 
                sys.exit(0)
   except OSError, e:  
         print >>sys.stderr, "fork failed: %d (%s)" % (e.errno, e.strerror)
         sys.exit(1)

   main() 

ダブルフォークを使っていると思いますが、それはできるはずです...でも今のところ運がありません。

これについての考えは大歓迎です。

4

1 に答える 1

1

私はこのリンクをbash構文の答えとして完全に信用しています:sshコマンドを使用してデーモンとしてプロセスを開始する方法は?

ダブルフォークする必要はありません。問題は、stdoutがまだ接続されていることです。Pythonのアプローチは次のとおりです。

wrapper.py

import subprocess
import os

def main():
    pid = subprocess.Popen(['nohup', '/path/to/main_p.py'], 
                            stdout = open(os.devnull, 'w+', 0),
                            stderr = subprocess.STDOUT
                            ).pid
    print pid

if __name__ == "__main__":

    main() 

そして、sshコマンドはこのラッパーを呼び出します。

ssh server /path/to/wrapper.py

stdout-> devullをリダイレクトするだけで、プロセスはすぐに戻ります。

于 2012-07-25T00:52:48.240 に答える