Python包装器脚本,让程序可以无阻塞地远程执行

Python包装器脚本,让程序可以无阻塞地远程执行,python,fork,Python,Fork,我正在寻找一个包装脚本来运行一个程序,该程序由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:

我正在寻找一个包装脚本来运行一个程序,该程序由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() 
我想使用双叉,我应该能够做到这一点。。。但到目前为止运气不好


非常感谢您对这方面的任何想法。

我完全相信此链接以bash语法给出的答案:

你甚至不需要双叉。问题是标准输出仍然是连接的。以下是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->devul,进程就会立即返回。

我完全相信这个链接提供了bash语法的答案:

你甚至不需要双叉。问题是标准输出仍然是连接的。以下是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,进程将立即返回。

您不能在shell脚本中使用
&
吗?缩进不正确。你能再检查一下吗?不太可能。。。我宁愿用包装器脚本来处理它…嗯,我刚刚意识到我现在无法控制ssh部分。。。所以基本上我不能。你不能在shell脚本中使用
&
吗?你的缩进不正确。你能再检查一下吗?不太可能。。。我宁愿用包装器脚本来处理它…嗯,我刚刚意识到我现在无法控制ssh部分。。。所以基本上不,我不能。@AmirReza:这是ssh命令调用的脚本,而不是ssh命令本身。您的ssh命令执行这个命令,启动您的实际进程。我的意思是,我的ssh行中没有“2>&1&”。ssh行是“ssh server wrapper.py”@AmirReza:你没在听我说什么。您的ssh命令与您刚才键入的完全相同。在wrapper.py内部,调用子流程命令,并将stdout重定向到dev null。当我通过ssh测试脚本时,您不需要对ssh命令调用脚本的方式做任何不同的操作。没有它,它会阻塞,直到过程完成。当我使用此方法时,ssh调用立即返回,进程仍在运行。这就是我的确切ssh命令:ssh-p22-I id\u dsafile-o StrictHostKeyChecking=no-o ConnectTimeout=30-o connectionattentits=2-o BatchMode=yes-Croot@server“wrapper.py x”@AmirReza:这在ssh命令调用的脚本中,不使用ssh命令本身。您的ssh命令执行这个命令,启动您的实际进程。我的意思是,我的ssh行中没有“2>&1&”。ssh行是“ssh server wrapper.py”@AmirReza:你没在听我说什么。您的ssh命令与您刚才键入的完全相同。在wrapper.py内部,调用子流程命令,并将stdout重定向到dev null。当我通过ssh测试脚本时,您不需要对ssh命令调用脚本的方式做任何不同的操作。没有它,它会阻塞,直到过程完成。当我使用此方法时,ssh调用立即返回,进程仍在运行。这就是我的确切ssh命令:ssh-p22-I id\u dsafile-o StrictHostKeyChecking=no-o ConnectTimeout=30-o connectionattentits=2-o BatchMode=yes-Croot@server“wrapper.py x”