
Если у меня есть 2 исполняемых файла ( /path/to/gcc/myapp.exe
, и /path/to/intel/myapp.exe
), один из которых скомпилирован компилятором Intel, а другой — стандартным gcc, запуск обоих будет отображаться top
как просто myapp
. Если я запущу оба и у меня будут запущены процессы как myapp
, есть ли способ узнать, какой процесс исходит из какого исполняемого файла?
У нас на кластере установлено множество приложений, и мне интересно не только, какие приложения используются чаще всего, но и какиеверсииприложений используются. Если я вижу 500 запусков R
, я хотел бы узнать, 100 из них из /path/to/R-3.2.1/intel/R
, а остальные 400 из /path/to/R-3.1.3/gcc/R
и т. д. Как это сделать?
решение1
Вы можете сделать это с помощью /proc
файловой системы, как указано вproc(5)
страница руководства:
/proc/[pid]/exe
В Linux 2.2 и более поздних версиях этот файл представляет собой символическую ссылку, содержащую фактический путь к выполненной команде.
Потому что этосимволическая ссылка, вы можете прочитатьцель(выполните , ls -l
чтобы увидеть путь).
Конечно [pid]
, это означает идентификатор процесса для конкретного исполняемого файла, который вас интересует, во время выполнения.
(Маловероятно, что у вас система с таким старым ядром Linux, поэтому варианта «всегда работает» должно быть достаточно).
Чтобы получить подсчет, вам просто нужен скрипт, который проходит /proc
по каждому каталогу, которым вы владеете (поскольку вы запускаете программы, вы можете видеть их /proc
данные), и сопоставляет имена путей с теми, которые вас интересуют.readlink
Программа, например, полезна в скриптах bash (и поскольку она является частью coreutils
, она, скорее всего, есть у вас в системе Linux).
решение2
Для этого вы можете запустить top
, а затем нажать c
на клавиатуре, чтобы переключиться на просмотр полного пути.
решение3
Если эти процессы выполняются с использованием другой командной строки (например, с использованием полного пути), вы можете нажать , c
чтобы показать/скрыть полную командную строку, с которой был выполнен процесс.