Просмотрите /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
- взял первый элемент вектора, а затем искал в нем пробелы и взял все перед первым пробелом. Если это был исполняемый файл - я остановился на этом. В противном случае я сделал readlink (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 происходит гораздо больше.