在Linux中通过进程ID获取进程名称

33
如何从进程ID获取进程名? 例如,我执行cat file1.txt命令,但我想知道该命令及其参数在系统中的进程ID。 是否有一个结构体可以确定它或类似的东西? 有什么想法吗?

1
可能是通过PID获取进程名称的重复问题。 - Hasturkun
7个回答

29

在 Unix 中没有通用的方法来做到这一点。
每个操作系统处理这个问题的方式都不同,有些非常困难。但是你提到了 Linux。对于 Linux 来说,信息存储在 /proc 文件系统中。
要获取进程 ID 为 9999 的命令行,请读取文件 /proc/9999/cmdline


13
要获取进程ID为9999的进程名称,请读取文件/proc/9999/comm - Skippy le Grand Gourou
1
问题是如何获取进程名称,而不是命令行。在我的SUSE系统中,我输入“head /proc/9999/cmdline”来获取kwrite进程的名称,它返回:“kdeinit4:kwrite [kdeinit]”。如果我使用/comm而不是/cmdline,则可以获得正确的结果:“kwrite”。 - Elmue
1
/proc/$pid/comm 似乎将输出截断为15个字符。这非常...非常糟糕... - Artfaith
2
@SkippyleGrandGourou 如果 /proc/<PID>/comm 达到 16 个字符或 TASK_COMM_LEN,它将被截断,更好的方法是读取 /proc/<PID>/exerealpath。如此所示 here - RikuPotato

16
在linux系统中,您可以查看/proc/目录。尝试键入man proc以获取更多信息。 /proc/$PID/cmdline的内容将为您提供进程$PID运行的命令行。还有一个/proc/self用于检查自己 :)
另一种选择(例如在Mac OS X上)是使用libproc。请参见libproc.h

你能告诉我你的答案和我的有什么不同吗? :) - Anubhab
17
当我开始写我的回答时,你的答案还没有出现 :) - robbie_c

15

POSIX C并没有提供一种标准API来通过PID获取进程名。

在Linux中,您可以通过LINUX Proc API获取名称:/proc/$PID/cmdline。相应的代码如下:

const char* get_process_name_by_pid(const int pid)
{
    char* name = (char*)calloc(1024,sizeof(char));
    if(name){
        sprintf(name, "/proc/%d/cmdline",pid);
        FILE* f = fopen(name,"r");
        if(f){
            size_t size;
            size = fread(name, sizeof(char), 1024, f);
            if(size>0){
                if('\n'==name[size-1])
                    name[size-1]='\0';
            }
            fclose(f);
        }
    }
    return name;
}

1
如果您在这里寻找使用mono工作的C#解决方案,请查看以下链接:http://stackoverflow.com/questions/29827331/workaround-for-bug-in-mono-wrong-process-processname-solved - Elmue

13

要获取进程ID为9000的进程名称,请使用以下命令:

ps -p 9000 -o comm=

3
虽然这个问题已经得到了回答,但我想补充一点意见。
在我的情况下,当进程1111通过pipe创建进程2222时(至少是我听说的),/proc/2222/cmdline并不能给出正确的进程名称,而是会给出类似于1111_1的东西。我必须使用/proc/2222/comm来获取正确的进程名称。

2

在Linux中使用以下命令:

最初的回答
ls -l /proc/[pid]/exe

它将提供进程/应用程序名称,翻译为:"

它将提供进程/应用程序名称

",其中保留了HTML标签。

1

ps --pid <pid> -o comm h: 该命令可提供可执行文件名称。例如,如果您运行脚本name.sh,则上述命令的输出为bash

ps --ppid <pid> -o comm h: 该命令的输出为name


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接