Как получить полное имя исполняемого файла запущенного процесса в Linux

Как получить полное имя исполняемого файла запущенного процесса в Linux

Я пишу скрипт, который будет использовать имя файла запущенных процессов. Однако я не могу определитьполныйисполняемое имя некоторых процессов.

Сначала я решил запросить Nameзапись в /proc/PID/status(или второе поле в /proc/PID/stat). Однако, согласностраница руководства, это поле всегда обрезается до 15 символов, но мне нужно полное имя, чтобы избежать конфликта/путаницы.

Ответ на вопросэтот вопроспредлагает использовать /proc/PID/cmdline, но есть и проблемы. Некоторые программы (например, chromium, electron) делают глупые/умные вещи со значением, /proc/PID/cmdlineпоэтому я не могу просто разделить данные там NULLи напрямую получить имя программы, как предлагается в man-странице - они заполняют множество вещей в исходном поле argv[0] и разделяют их пробелом, и я не думаю, что простое разделение пробелом - хороший выбор, потому что путь/имя файла могут содержать пробелы.

Это становится еще сложнее, когда я обнаруживаю, что некоторые скрипты (например, скрипты Python) находятся в форме, /usr/bin/python /path/to/scriptа некоторые — в форме /path/to/script. Хотя с этим гораздо проще справиться, пока у меня есть это поле (без задержек, как выше) и я вручную проверяю и разделяю.

Есть идеи, как получить полное имя программы/файла? Неважно, содержит ли имя полный путь или нет, потому что с этим можно легко справиться (насколько я сейчас вижу).

решение1

/proc/$PID/exeкажется, это то, что вы ищете: (proc(5)

/proc/[pid]/exe
В Linux 2.2 и более поздних версиях этот файл является символической ссылкой, содержащей фактический путь к исполняемой команде. Эту символическую ссылку можно разыменовать обычным образом; попытка открыть ее приведет к открытию исполняемого файла.

Итак, просто:

$ /bin/cat & readlink /proc/$!/exe
/bin/cat

На самом деле это следует за переименованиями исполняемого файла:

/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog

решение2

На платформе со стандартной procfsподдержкой procfs-2 вы получите результат через:

ls -l /proc/<pid>/path/a.out

Файл a.out представляет собой символическую ссылку на абсолютный путь к двоичному файлу.

Обратите внимание, что в вопросе не упоминается Linux, и по этой причине имеет смысл предоставить информацию о том, как эта функция работает в procfsоригинальной реализации от создателя procfs Роджера Фолкнера.

Связанный контент