7

我有一个 python 脚本'b.py',它每 5 秒打印一次。

while (1):
   print "Start : %s" % time.ctime()
   time.sleep( 5 )
   print "End : %s" % time.ctime()
   time.sleep( 5 )

在我的 a.py 中,我通过以下方式调用 b.py:

def run_b():
        print "Calling run b"
    try:
        cmd = ["./b.py"]

        p = subprocess.Popen(cmd,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT)

        for line in iter(p.stdout.readline, b''):
                        print (">>>" + line.rstrip())


    except OSError as e:
        print >>sys.stderr, "fcs Execution failed:", e  

    return None  

稍后,我通过以下方式杀死 'b.py': PS_PATH = "/usr/bin/ps -efW"

def kill_b(program):
    try:

        cmd = shlex.split(PS_PATH)

        retval = subprocess.check_output(cmd).rstrip()
        for line in retval.splitlines():

            if program in line:
                print "line =" + line
                pid = line.split(None)[1]
                os.kill(int(pid), signal.SIGKILL)

    except OSError as e:
        print >>sys.stderr, "kill_all Execution failed:", e
    except subprocess.CalledProcessError as e:
        print >>sys.stderr, "kill_all Execution failed:", e

run_b()
time.sleep(600)
kill_b("b.py")

我有 2 个问题。1. 为什么我没有看到“b.py”的任何打印结果,而当我执行“ps -efW”时,我没有看到名为“b.py”的进程?2. 为什么当我像上面那样杀死一个进程时,我看到“权限被拒绝”?

我在 windows 下的 cygwin 上运行上面的脚本。

谢谢你。

4

1 回答 1

1
  1. 为什么我没有看到“b.py”的任何打印结果,而当我执行“ps -efW”时,没有看到名为“b.py”的进程?

    run_b()行:

    p = subprocess.Popen(cmd,
                         stdout=sys.stdout,
                         stderr=sys.stderr)
    

    您不会看到名为“b.py”的进程,但会看到类似“python b.py”的进程,但略有不同。您应该使用 pid 而不是 name 来查找它(在您的代码中“p.pid”有 pid)。

  2. 为什么当我像上面那样杀死一个进程时,我看到“权限被拒绝”?

    os.kill 仅在 Windows 2.7+ 下受支持,并且与 posix 版本略有不同。但是,您可以使用“p.pid”。以跨平台方式终止进程的最佳方法是:

    if platform.system() == "Windows":
        subprocess.Popen("taskkill /F /T /PID %i" % p.pid, shell=True)
    else:
        os.killpg(p.pid, signal.SIGKILL)
    

killpg也适用于 OS X 和其他 Unixy 操作系统。

于 2013-10-25T09:08:58.573 回答