Получить реальный путь приложения из 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);