Получение снимка процесса до его завершения - PullRequest
3 голосов
/ 18 июля 2011

Я хотел бы выполнить командную строку и получить снимок его дерева /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)

1 Ответ

2 голосов
/ 18 июля 2011
  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.

...