2011-07-18 68 views
3

我想是执行一个命令行,并得到了/proc树的快照之前。重点是尽可能多地了解该过程。获取过程的快照,它终止

一个潜在的问题是,在我完成复印东西的过程可能会终止。任何建议如何解决这个问题?

这里是我到目前为止

#!/usr/bin/python 
# 
# run command line and copy it's /proc tree to /tmp/proctree 
# Example: copy_proc.py ls -l 

import sys, os, shutil, subprocess as sp 

if __name__=='__main__': 
    f=open('/dev/null', 'w') 
    p = sp.Popen(sys.argv[1:],stdout=f, stderr=f) 
    if not os.path.exists('/tmp/proctree'): 
    os.makedirs('/tmp/proctree') 
    for f in os.listdir('/proc/'+str(p.pid)): 
    shutil.copyfile(os.path.join('/proc',f), '/tmp/proctree/'+f) 

回答

2
  1. 每一个符号链接也是一个文件。
  2. for f in os.listdir(path): do_something_with(f),除非你是你的CWD是path是错误的。

另外,检查这段代码的输出:

import os 

base = "/proc/%d" % os.getpid() 
for f in os.listdir(base): 
    f = os.path.join(base, f) 
    print "%-40s %5s %5s %5s" % (f, os.path.isfile(f), os.path.islink(f), os.path.isdir(f)) 

现在关于这个问题的第一部分。当子进程终止时,除非为那个孩子调用wait(2),否则它变成僵尸。这意味着,如果你没有看上SIGCHLD处理程序在你的程序,你可以放心地做任何你想要与您孩子的/proc/<pid>目录wait(2)被调用之前。

您也可以尝试将SIGSTOP发送给您的孩子,制作您想要的快照,然后发送SIGCONT

+0

好点,ISFILE/ISDIR实际上似乎按预期方式工作,我做了一个错误的'isfile'线 –

+0

我已经更新了我的答复同一个问题的第一个问题。 – abbot

+0

唔...我不知道,如果当过程变成僵尸的/ proc/ /图被清除。我得到它是空的这不是我所期望的 –