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 命令启动进程作为守护进程?

你甚至不需要双叉。问题是标准输出仍然连接。这是python方法:

包装器.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 回答