Получить реальный путь приложения из pid?

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

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

6 ответов

Решение

Получить имя / местоположение процесса довольно просто, если вы знаете 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;
}

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

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

ps xuwww -p PID

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

man ps

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

пример:

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

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

Если PID является PID "пользовательского приложения", то вы можете получить NSRunningApplication такого приложения:

NSRunningApplication * app = [NSRunningApplication  
    runningApplicationWithProcessIdentifier:pid
];

И распечатать путь к исполняемому файлу:

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

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

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

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

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

Я хотел бы сделать лучший 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

Используйте этот код для поиска processinfo psn.

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

OSStatus GetProcessBundleLocation (const ProcessSerialNumber *psn, FSRef *location);
Другие вопросы по тегам