Linux 进程 ID(PID)检察 / 获取

打印 上一主题 下一主题

主题 1004|帖子 1004|积分 3012

注:本文为“Linux 进程 ID 获取”干系文章合辑。

作者:Magesh Maruthamuthu
译者:geekpi 校对:wxy
| 2018-02-13 18:57
我们查询 PID 主要是用来杀死一个没有相应的程序,它类似于 Windows 使命管理器一样。 Linux GUI 也提供雷同的功能,但 CLI 是执行 kill 操纵的有效方法。
进程 ID

PID 代表进程标识号 process identification,它在大多数操纵体系内核(如 Linux、Unix、macOS 和 Windows)中使用。它是在操纵体系中创建时主动分配给每个进程的唯一标识号。一个进程是一个正在运行的程序实例。
除了 init 进程外其他全部的进程 ID 每次都会改变,因为 init 始终是体系上的第一个进程,而且是全部其他进程的父进程。它的 PID 是 1。
PID 默认的最大值是 32768。可以在你的体系上运行 cat /proc/sys/kernel/pid_max 来验证。在 32 位体系上,32768 是最大值,但是我们可以在 64 位体系上将其设置为最大                                              2                            22                                       2^{22}                  222(约 4 百万)内的任何值。
你可能会问,为什么我们需要这么多的 PID?因为我们不能立即重用 PID,这就是为什么。别的为了防止可能的错误。
体系正在运行的进程的 PID 可以通过使用 pidof、pgrep、ps 和 pstree 命令找到。
方法 1: pidof 命令

pidof 用于查找正在运行的程序的进程 ID。它在标准输出上打印这些 id。为了演示,我们将在 Debian 9(stretch)体系中找出 Apache2 的进程 ID。
  1. \# pidof apache2
  2. 3754 2594 2365 2364 2363 2362 2361
复制代码
从上面的输出中,你可能会遇到难以辨认进程 ID 的问题,因为它通过进程名称显示了全部的 PID(包括父进程和子进程)。因此,我们需要找出父 PID(PPID),这是我们要查找的。它可能是第一个数字。在本例中,它是 3754,并按降序分列。
方法 2: pgrep 命令

pgrep 遍历当前正在运行的进程,并将符合选择条件的进程 ID 列到标准输出中。
  1. \# pgrep apache2
  2. 2361
  3. 2362
  4. 2363
  5. 2364
  6. 2365
  7. 2594
  8. 3754
复制代码
这也与上面的输出类似,但是它将结果从小到大排序,这清楚地说明父 PID 是最后一个。在本例中,它是 3754。
注意: 假如你有多个进程的进程 ID,那么在使用 pidof 和 pgrep 辨认父进程 ID 时就可能不会很顺利。
方法 3: pstree 命令

pstree 将运行的进程显示为一棵树。树的根是某个 pid,假如省略了 pid 参数,那么就是 init。假如在 pstree 命令中指定了用户名,则显示相应用户拥有的全部进程。
pstree 会将雷同的分支放在方括号中,并添加重复计数的前缀来可视化地合并到一起。
  1. \# pstree -p | grep "apache2"
  2. |- apache2(3754) -|-apache2(2361)
  3. | |-apache2(2362)
  4. | |-apache2(2363)
  5. | |-apache2(2364)
  6. | |-apache2(2365)
  7. | `-apache2(2594)
复制代码
要单独获取父进程,请使用以下格式。
  1. \# pstree -p | grep "apache2" | head -1
  2. |- apache2(3754) -|-apache2(2361)
复制代码
pstree 命令非常简单,因为它分别隔离了父进程和子进程,但这在使用 pidof 和 pgrep 时命令不容易做到。
方法 4: ps 命令

ps 显示运动进程的选择信息。它显示进程 ID(pid=PID)、与进程关联的终端(tname=TTY)、以 [DD-]hh:mm:ss 格式(time=TIME)显示的累计 CPU 时间、以及执行名(ucmd = CMD)。输出默认是未排序的。
  1. \# ps aux | grep "apache2"
  2. www-data 2361 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start
  3. www-data 2362 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start
  4. www-data 2363 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start
  5. www-data 2364 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start
  6. www-data 2365 0.0 0.4 302652 8400 ? S 06:25 0:00 /usr/sbin/apache2 -k start
  7. www-data 2594 0.0 0.4 302652 8400 ? S 06:55 0:00 /usr/sbin/apache2 -k start
  8. root 3754 0.0 1.4 302580 29324 ? Ss Dec11 0:23 /usr/sbin/apache2 -k start
  9. root 5648 0.0 0.0 12784 940 pts/0 S+ 21:32 0:00 grep apache2
复制代码
从上面的输出中,我们可以根据进程的启动日期轻松地辨认父进程 ID(PPID)。在此例中,apache2 启动于 Dec 11,它是父进程,其他的是子进程。apache2 的 PID 是 3754。

代码获取进程

桐叶岩 于 2024-07-24 10:07:23 发布
Linux体系中,每个进程都有对应的目录和文件,可以直接访问这些文件来获取进程信息,其中 PID 可以从进程的 /proc/PID/ 目录中的 status 或 cmdline 文件中找到。
检察 /proc 文件体系
  1. cat /proc/<PID>/status | grep '^Pid:'
复制代码
代码实现获取进程 ID
可以通过操纵体系提供的 API 来实现。常见的方式是使用 <unistd.h> 头文件中的 getpid() 函数。
  1. #include <iostream>
  2. #include <unistd.h>
  3. int main() {
  4.     // 获取当前进程的PID
  5.     pid_t pid = getpid();
  6.    
  7.     std::cout << "PID of the current process: " << pid << std::endl;
  8.    
  9.     return 0;
  10. }
复制代码
假如你想根据进程名获取进程的PID,通常需要使用操纵体系提供的功能来遍历体系中的进程并匹配进程名。在Linux体系中,可以使用 proc 文件体系来实现这个目的。
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <unistd.h>
  7. // 函数:根据进程名获取PID
  8. pid_t get_pid_by_name(const std::string& process_name) {
  9.     pid_t pid = -1;
  10.     std::ifstream ifs("/proc/self/stat");
  11.     std::string line;
  12.     while (std::getline(ifs, line)) {
  13.         std::istringstream iss(line);
  14.         std::vector<std::string> tokens{std::istream_iterator<std::string>{iss},
  15.                                          std::istream_iterator<std::string>{}};
  16.         
  17.         if (tokens.size() < 2) {
  18.             continue;
  19.         }
  20.         
  21.         std::string cmd = tokens[1];
  22.         
  23.         // Remove parentheses from cmd (process name)
  24.         if (!cmd.empty() && cmd[0] == '(' && cmd[cmd.size()-1] == ')') {
  25.             cmd = cmd.substr(1, cmd.size()-2);
  26.         }
  27.         if (cmd == process_name) {
  28.             pid = std::stoi(tokens[0]);
  29.             break;
  30.         }
  31.     }
  32.     return pid;
  33. }
  34. int main() {
  35.     std::string process_name = "nginx";
  36.     pid_t pid = get_pid_by_name(process_name);
  37.     if (pid != -1) {
  38.         std::cout << "PID of process '" << process_name << "': " << pid << std::endl;
  39.     } else {
  40.         std::cout << "Process '" << process_name << "' not found." << std::endl;
  41.     }
  42.     return 0;
  43. }
复制代码
这段代码在Linux环境下使用,依赖于 /proc 文件体系来获取进程信息。因此,在其他操纵体系上(如Windows)可能无法直接运行或需要不同的实现方法。进程名在 /proc/self/stat 文件中被括号括起来,以是在比较时需要去除括号。该示例代码相对简单,实际应用中可能需要更复杂的逻辑来处理惩罚各种情况,如多个同名进程等。

Linux 下获得进程 id 和进程名字

bulreed 于 2011-08-12 18:33:04 发布
编程过程中,有的时候需要通过进程 id 来得到进程的名字,或则通过进程的名字来得到 id。通过 shell 可以很容易得到,这里通过代码来实现。
通过进程名字得到进程 id。
  1. pid_t getProcessPidbyName(char *name)
  2. {
  3.    FILE *fptr;
  4.    char *buf = new char[255];
  5.    char cmd[255] = {'\0'};
  6.    pid_t pid = -1;
  7.    sprintf(cmd,"pidof %s",name);
  8.    if((fptr = popen(cmd,"r")) != NULL)
  9.    {
  10.      if(fgets(buf,255,fptr) != NULL)
  11.      {
  12.        pid = atoi(buf);
  13.        printf("pid = %d\n",pid);
  14.      }
  15.    }
  16.   pclose(fptr);
  17.    delete buf;
  18.    return pid;
  19. }
复制代码
这里的传入参数 name 是进程的名字,不是它的绝对路径名。
通过进程 id 得到进程的文件路劲名字,进程存在的绝对路径名。
  1. bool getPathNamebyPid(pid_t pid,char *name)
  2. {
  3.    FILE *fptr;
  4.    bool bret = false;
  5.    char cmd[255] = {'\0'};
  6.    sprintf(cmd,"readlink /proc/%d/exe",pid);
  7.    if((fptr = popen(cmd,"r")) != NULL)
  8.    {
  9.      if(fgets(name,255,fptr) != NULL)
  10.      {
  11.        printf("the path name is %s.\n",name);
  12.        bret = true;
  13.      }
  14.   }
  15.   pclose(fptr);
  16.    return bret;
  17. }
复制代码
这里得到的是进程的绝对路径名,传入的参数,需要在外部为其开辟空间。用完需要开释。
通过文件的绝对路径名天然就很容易得到进程的名字。
  1. bool getProcessNamebyPathName(const char* pathName,char* name)
  2. {
  3.    memset(name,'\0',255);
  4.    const char* pos = strrchr(pathName,'/');
  5.    if(pos == 0)
  6.    {
  7.      strcpy(name,pathName);
  8.    }
  9.    else
  10.    {
  11.      strcpy(name,pos+1);
  12.    }
  13.    return true;
  14. }
复制代码
就是从绝对路径名中拿出进程名。传入参数 pathName,传出参数 name 需要在外部开辟空间。
结合前面博文.,就能够根据进程名,判断是否存在同名进程。

Linux 下获取当进步程 ID、进程名、进程路径

我是黄老邪于 2016-04-27 12:01:48 发布
  1.     #include <stdio.h>
  2.     #include <string.h>
  3.     #include <unistd.h>
  4.      
  5.     int main()
  6.     {
  7.             pid_t pid = getpid();
  8.             char strProcessPath[1024] = {0};
  9.             if(readlink("/proc/self/exe", strProcessPath,1024) <=0)
  10.             {
  11.                             return -1;
  12.             }
  13.      
  14.             char *strProcessName = strrchr(strProcessPath, '/');
  15.      
  16.             if(!strProcessName)
  17.             {
  18.                             printf("当前进程ID:%d\n", pid);
  19.                             printf("当前进程名:\n");
  20.                             printf("当前进程路径:%s\n", strProcessPath);
  21.             }
  22.             else
  23.             {
  24.                             printf("当前进程ID:%d\n", pid);
  25.                             printf("当前进程名:%s\n", ++strProcessName);
  26.                             printf("当前进程路径:%s\n", strProcessPath);
  27.             }
  28.      
  29.             return 0;
  30.     }
复制代码

via:


  • How to Find the Process ID (PID) of a Program Running on Linux | 2DayGeek
    https://www.2daygeek.com/check-find-parent-process-id-pid-ppid-linux/
  • Linux下通过进程名、ID、端口号检察进程信息-CSDN博客 玩转智能机器人 于 2021-10-18 14:52:54 发
    https://blog.csdn.net/u011198687/article/details/120825794
  • 在 Linux 环境中怎样获取进程 id_linux获取进程id-CSDN博客 桐叶岩 于 2024-07-24 10:07:23 发布
    https://blog.csdn.net/m0_60697583/article/details/140655033
  • Linux 下获得进程 id 和进程名字_linux id 程序名-CSDN博客 bulreed于 2011-08-12 18:33:04 发布
    https://blog.csdn.net/bulreed/article/details/6682811
  • Linux 下获取当进步程 ID、进程名、进程路径-CSDN博客 我是黄老邪于 2016-04-27 12:01:48 发布
    https://blog.csdn.net/dezhihuang/article/details/51260001

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表