Я пишу скрипт, который будет использовать имя файла запущенных процессов. Однако я не могу определитьполныйисполняемое имя некоторых процессов.
Сначала я решил запросить 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 Роджера Фолкнера.