Посмотрите /proc/$PID/cmdline
, а затем os.readlink () на /proc/$PID/exe
.
/proc/$PID/cmdline
не обязательно будет правильным, поскольку программа может изменить свой вектор аргументов или он может не содержать полный путь. Три примера этого из моего текущего списка процессов:
avahi-daemon: chroot helper
qmgr -l -t fifo -u
/usr/sbin/postgrey --pidfile=/var/run/postgrey.pid --daemonize --inet=127.0.0.1:60000 --delay=55
Первый очевиден - это недопустимый путь или имя программы. Второй - это просто исполняемый файл без имени пути. Третий выглядит нормально, но на самом деле вся командная строка находится в argv[0]
с пробелами, разделяющими аргументы. Обычно у вас должны быть аргументы, разделенные NUL.
Все это показывает, что /proc/$PID/cmdline
(или вывод ps (1)) ненадежен.
Однако и /proc/$PID/exe
тоже. Обычно это символическая ссылка на исполняемый файл, который является основным текстовым сегментом процесса. Но иногда после него стоит «(deleted)
», если исполняемый файл больше не находится в файловой системе.
Кроме того, программа, представляющая собой текстовый сегмент, не всегда то, что вам нужно. Например, /proc/$PID/exe
из этого /usr/sbin/postgrey
примера выше - это /usr/bin/perl
. Так будет со всеми интерпретируемыми скриптами (#!).
Я остановился на синтаксическом анализе /proc/$PID/cmdline
- взятии первого элемента вектора, а затем поиске пробелов в нем и взятии всего до первого пробела. Если это был исполняемый файл - я остановился на этом. В противном случае я сделал ссылку для чтения (2) на /proc/$PID/exe
и удалил все строки «(deleted)
» на конце. Эта первая часть завершится ошибкой, если в имени исполняемого файла действительно есть пробелы. С этим ничего не поделаешь.
КСТАТИ. Аргумент использования ps (1) вместо /proc/$PID/cmdline
в этом случае неприменим, так как вы собираетесь вернуться к /proc/$PID/exe
. Вы будете зависеть от файловой системы /proc
, поэтому вы также можете читать ее с помощью read (2) вместо pipe (2), fork (2), execve (2), readdir (3) ..., write (2) прочтите (2). Хотя ps и /proc/$PID/cmdline
могут быть одинаковыми с точки зрения строк кода Python, за кулисами с ps происходит гораздо больше.
18.09.2009
ps(1)
. 18.09.2009ps
берет информацию из командной строки? 18.09.2009/proc
). Но когда вместо/proc
изобретут/foobar
систему, вам придется переписывать свою программу. В любом случае, возможно, мне повредили мозг из-за работы в рабочей группе LSB, но вам действительно следует придерживаться стандартов, когда этого достаточно для вас - а это тот случай, который мы рассматриваем. 18.09.2009/proc/$PID/cmdline
) 03.10.2012