Получить реальный путь приложения из pid? - PullRequest
20 голосов
/ 22 сентября 2011

Как узнать подробности процесса, такие как имя приложения и реальный путь приложения, из идентификатора процесса?

Я использую Mac OS X.

Ответы [ 6 ]

28 голосов
/ 16 ноября 2011

Получить имя / местоположение процесса довольно просто, если вы знаете PID, просто используйте proc_name или proc_pidpathПосмотрите на следующий пример, в котором указан путь процесса:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <libproc.h>

int main (int argc, char* argv[])
{
    pid_t pid; int ret;
    char pathbuf[PROC_PIDPATHINFO_MAXSIZE];

    if ( argc > 1 ) {
        pid = (pid_t) atoi(argv[1]);
        ret = proc_pidpath (pid, pathbuf, sizeof(pathbuf));
        if ( ret <= 0 ) {
            fprintf(stderr, "PID %d: proc_pidpath ();\n", pid);
            fprintf(stderr, "    %s\n", strerror(errno));
        } else {
            printf("proc %d: %s\n", pid, pathbuf);
        }
    }

    return 0;
}
18 голосов
/ 22 сентября 2011

Вы можете использовать Монитор активности - http://en.wikipedia.org/wiki/Activity_Monitor

Или в терминальном приложении вы можете использовать:

ps xuwww -p PID

PID - это идентификатор процесса, который вы ищете Дополнительная помощьпо команде 'ps` вы можете найти с

man ps
8 голосов
/ 10 мая 2013

Попробуйте использовать lsof

пример:

lsof -p 1066 -Fn | awk 'NR==2{print}' | sed "s/n\//\//"

выход:
/Users/user/Library/Application Support/Sublime Text 2/Packages

2 голосов
/ 08 сентября 2015

Если PID является PID «пользовательского приложения», то вы можете получить NSRunningApplication приложения следующим образом:

NSRunningApplication * app = [NSRunningApplication  
    runningApplicationWithProcessIdentifier:pid
];

А для печати пути к исполняемому файлу:

NSLog(@"Executable of app: %@", app.executableURL.path);

сам пакет приложений находится здесь

NSLog(@"Executable of app: %@", app.bundleURL.path);

Однако это не будет работать с системными или фоновыми процессами, оно ограничено пользовательскими приложениями (которые обычно отображаются в доке после запуска). Объект NSRunningApplication позволяет проверить, является ли приложение активным, скрыть / показать его и выполнить все другие полезные действия.

Просто подумал, что я упомянул это здесь для полноты. Если вы хотите работать с произвольными процессами, тогда принятый ответ, конечно, лучше.

0 голосов
/ 29 декабря 2016

Я хотел бы сделать лучший ssh-copy-id только в bash !!Для этого я должен знать, где находится sshd, чтобы спросить его о его реальной конфигурации.В некоторых системах у меня есть несколько sshd, и это не мой друг.Также на некоторых macOS команда ps не показывала полный путь для sshd.

lsof -p $PPID | grep /sshd | awk '{print $9}'

это возвращение

/usr/sbin/sshd

после того, как я мог запросить

sudo /usr/sbin/sshd -T | grep authorizedkeysfile

это возвращение, в какой-то системе

authorizedkeysfile .ssh/authorized_keys

, поэтому я должен поместить в .ssh / authorized_keys

0 голосов
/ 27 сентября 2011

Используйте этот код , чтобы найти psn processinfo.

Затем используйте следующую функцию для определения местоположения,

OSStatus GetProcessBundleLocation (const ProcessSerialNumber *psn, FSRef *location);
...