linux 获得子进程pid_linux 已知进程pid获取父进程pid - CSDN
  • linux查看进程所有子进程和线程 原文连接:https://blog.csdn.net/uestczshen/article/details/74091892   问题: 我的程序在其内部创建并执行了多个线程,我怎样才能在该程序创建线程后监控其中单个线程?我想...

    linux查看进程所有子进程和线程

    原文连接:https://blog.csdn.net/uestczshen/article/details/74091892

      

    问题: 我的程序在其内部创建并执行了多个线程,我怎样才能在该程序创建线程后监控其中单个线程?我想要看到带有它们名称的单个线程详细情况(如,CPU/内存使用率)。

    线程是现代操作系统上进行并行执行的一个流行的编程方面的抽象概念。当一个程序内有多个线程被叉分出用以执行多个流时,这些线程就会在它们之间共享特定的资源(如,内存地址空间、打开的文件),以使叉分开销最小化,并避免大量高成本的IPC(进程间通信)通道。这些功能让线程在并发执行时成为一个高效的机制。

    在Linux中,程序中创建的线程(也称为轻量级进程,LWP)会具有和程序的PID相同的“线程组ID”。然后,各个线程会获得其自身的线程ID(TID)。对于Linux内核调度器而言,线程不过是恰好共享特定资源的标准的进程而已。经典的命令行工具,如ps或top,都可以用来显示线程级别的信息,只是默认情况下它们显示进程级别的信息。

    这里提供了在Linux上显示某个进程的线程的几种方式。

    注:lwp      LWP    lwp (light weight process, or thread) ID of the lwp being reported. (alias spid, tid).就是说lwp spid tid都是指线程ID.

    1.利用进程名获取进程号(以syslog为例)

    ps -ef|grep syslog|grep -v "grep"|awk '{print $2}'

    先看ps -ef|grep syslog的输出:(我没有打马赛克,千万不要攻击我的电脑啊)

    grep的输出都会有grep自身这个进程在,用grep -v "grep"可以把这一行干掉,然后awk '{print $2}'就是打印第二列数字,即722

    2.利用进程号查看该进程下的线程

        ps -eLf|grep 722|grep -v "grep" ,输出如下:

    第四列就是线程号

       ps -T -p 722,输出如下:(SPID即线程号)

    3,利用top -H -p 722查看线程cpu利用率

    第二行(Threads):总共4个线程,0个正在执行,4个睡眠,0个stopped, 0个zombie(僵尸),%CPU和%MEM即cpu占有率和内存占有率,其他字段含义参考top命令

    4.pstree -p 722(树状图显示)

    展开全文
  • 每个人都知道 PID,究竟什么是 PID?为什么你想要 PID?你打算用 PID 做什么?你脑子里有同样的问题吗?如果是这样,你就找对地方了解这些细节了。-- Magesh Maruthamuthu本文导航◈ 什么是进程 ID?08%◈ 方法 1:...
        
    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1每个人都知道 PID,究竟什么是 PID?为什么你想要 PID?你打算用 PID 做什么?你脑子里有同样的问题吗?如果是这样,你就找对地方了解这些细节了。-- Magesh Maruthamuthu
    本文导航◈ 什么是进程 ID?08%◈ 方法 1:使用 pidof 命令30%◈ 方法 2:使用 pgrep 命令41%◈ 方法 3:使用 pstree 命令52%◈ 方法 4:使用 ps 命令69%编译自 | https://www.2daygeek.com/how-to-check-find-the-process-id-pid-ppid-of-a-running-program-in-linux/ 
     作者 | Magesh Maruthamuthu
     译者 | geekpi

    每个人都知道 PID,究竟什么是 PID?为什么你想要 PID?你打算用 PID 做什么?你脑子里有同样的问题吗?如果是这样,你就找对地方了解这些细节了。

    我们查询 PID 主要是用来杀死一个没有响应的程序,它类似于 Windows 任务管理器一样。 Linux GUI 也提供相同的功能,但 CLI 是执行 kill 操作的有效方法。

    什么是进程 ID?

    PID 代表进程标识号process identification,它在大多数操作系统内核(如 Linux、Unix、macOS 和 Windows)中使用。它是在操作系统中创建时自动分配给每个进程的唯一标识号。一个进程是一个正在运行的程序实例。

    建议阅读: 如何查看 Apache Web 服务器在 Linux 中的运行时间[1]

    除了 init 进程外其他所有的进程 ID 每次都会改变,因为 init 始终是系统上的第一个进程,并且是所有其他进程的父进程。它的 PID 是 1。

    PID 默认的最大值是 32768。可以在你的系统上运行 cat /proc/sys/kernel/pid_max 来验证。在 32 位系统上,32768 是最大值,但是我们可以在 64 位系统上将其设置为最大 222(约 4 百万)内的任何值。

    你可能会问,为什么我们需要这么多的 PID?因为我们不能立即重用 PID,这就是为什么。另外为了防止可能的错误。

    系统正在运行的进程的 PID 可以通过使用 pidofpgrepps 和 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


    via: https://www.2daygeek.com/how-to-check-find-the-process-id-pid-ppid-of-a-running-program-in-linux/

    作者:Magesh Maruthamuthu[3] 译者:geekpi 校对:wxy

    本文由 LCTT 原创编译,Linux中国 荣誉推出

    LCTT 译者640?wx_fmt=pnggeekpi ? ?共计翻译:654 篇贡献时间:1569 天

    推荐文章

    < 左右滑动查看相关文章 >

    640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png640?wx_fmt=gif640?wx_fmt=gif

    点击图片、输入文章 ID 或识别二维码直达


    原文链接请访问“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。



    展开全文
  • linux如何获得进程pid

    2019-02-18 16:57:55
    方法一 #ps -ef |grep xxx |awk '{print $1}' e.g:  ps -ef |grep java |awk '{print $1}' ... 2、举个例子,获取当前用户下的java进程pid】  [admin@vm168a ~]$ ps -ef |grep java ...

    方法一

    #ps -ef |grep xxx  |awk '{print $1}'

    e.g:

          ps -ef |grep java |awk '{print $1}'

    注释:

          1、xxx为执行的命令名称

          2、举个例子,获取当前用户下的java进程 【pid】

               [admin@vm168a ~]$ ps -ef |grep java |awk '{print $1}'

               16920

          3、用到三个命令,ps、grep、awk。

     

    方法二(推荐)

    $pgrep xxx 

    e.g:

    pgrep java

    原文:http://lionbule.iteye.com/blog/713585

    统计java进程的数目:

    proNo=`pgrep java | wc -l`

    展开全文
  • python代码获取linux进程pid 在某些需求中,我们需要根据某些条件动态的执行或者停止某程序(linux环境下),对于动态执行,一般没有什么难度。 开始某程序:需要知道程序的路径,以及对应的.py文件 os.system(‘cd ...

    python代码获取linux进程pid

    在某些需求中,我们需要根据某些条件动态的执行或者停止某程序(linux环境下),对于动态执行,一般没有什么难度。

    开始某程序:需要知道程序的路径,以及对应的.py文件

    os.system(‘cd {} && python {}’.format(file_path,a.py))

    上面就是表明执行a.py文件

    动态停止某程序。

    上网搜索好久,一般推荐的方法都是安装 psutil,

    import  psutil;
    for proc in psutil.process_iter():
        print("pid-%d,name:%s" % (proc.pid,proc.name()))
    
    #执行结果
    pid-1,name:systemd
    pid-2,name:kthreadd
    pid-3,name:ksoftirqd/0
    pid-5,name:kworker/0:0H
    pid-6,name:kworker/u12:0
    pid-7,name:rcu_sched
    pid-8,name:rcu_bh
    pid-9,name:migration/0
    pid-10,name:watchdog/0
    pid-11,name:watchdog/1
    pid-12,name:migration/1
    pid-13,name:ksoftirqd/1
    pid-15,name:kworker/1:0H
    pid-16,name:watchdog/2
    pid-17,name:migration/2
    pid-18,name:ksoftirqd/2
    pid-20,name:kworker/2:0H
    pid-21,name:watchdog/3
    pid-22,name:migration/3
    pid-23,name:ksoftirqd/3
    pid-25,name:kworker/3:0H
    pid-26,name:watchdog/4
    pid-27,name:migration/4
    

    但在实际操作中发现,此种方法并不能解决想要获取pid的问题。因为其后面显示的信息并不精确。比如我们python执行两个.py文件,则结果中的name:python,会出现两个,这样我们如何能获得pid?

    实际:

    import os
    pid=os.popen('ps -ef | grep  main.py ').readlines()[0].split()[1]
    #此处的popen会把命令的输出作为返回值,我们再采用读文件的形式再根据实际情况进行分割,取其下标即可
    #此处补充os.system(cmd) 返回值只会有0(成功),1,2
    print(pid)
    
    #执行结果
    19212
    
    展开全文
  • 查看指定进程是否存在导读Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运行进程,因此在获取进程 pid 上二者也有所区别。交互式 Bash Shell 获取进程 pid在已知进程名(name)的...

    导读

    Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运行进程,因此在获取进程 pid 上二者也有所区别。

    交互式 Bash Shell 获取进程 pid

    在已知进程名(name)的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加 -v grep是为了避免匹配到 grep 进程):

    ps -ef | grep "name" | grep -v grep | awk '{print $2}'

    或者不使用 grep(这里名称首字母加[]的目的是为了避免匹配到 awk 自身的进程):

    ps -ef | awk '/[n]ame/{print $2}'

    如果只使用 x 参数的话则 pid 应该位于第一位:

    ps x | awk '/[n]ame/{print $1}'

    最简单的方法是使用 pgrep:

    pgrep -f name

    如果需要查找到 pid 之后 kill 掉该进程,还可以使用 pkill:

    pkill -f name

    如果是可执行程序的话,可以直接使用 pidof

    pidof name

    Bash Shell 脚本获取进程 pid

    根据进程名获取进程 pid
    在使用 Shell 脚本获取进程 pid 时,如果直接使用上述命令,会出现多个 pid 结果,例如

    #! /bin/bash
    # process-monitor.sh
    process=$1
    pid=$(ps x | grep $process | grep -v grep | awk '{print $1}')
    echo $pid

    执行 process-monitor.sh 会出现多个结果:

    $> sh process-monitor.sh
    3036  3098  3099

    进一步排查可以发现,多出来的几个进程实际上是子 Shell 的(临时)进程:

    root      3036  2905  0 09:03 pts/1    00:00:45 /usr/java/jdk1.7.0_71/bin/java ...name
    root      4522  2905  0 16:12 pts/1    00:00:00 sh process-monitor.sh name
    root      4523  4522  0 16:12 pts/1    00:00:00 sh process-monitor.sh name

    其中 3036 是需要查找的进程pid,而 4522、4523 就是子 Shell 的 pid。 为了避免这种情况,需要进一步明确查找条件,考虑到所要查找的是 Java 程序,就可以通过 Java 的关键字进行匹配:

    #! /bin/bash
    # process-monitor.sh
    process=$1
    pid=$(ps -ef | grep $process | grep '/bin/java' | grep -v grep | awk '{print $2}')
    echo $pid

    获取 Shell 脚本自身进程 pid

    这里涉及两个指令:
    1. $$ :当前 Shell 进程的 pid
    2. 2. $! :上一个后台进程的 pid 可以使用这两个指令来获取相应的进程 pid。例如,如果需要获取某个正在执行的进程的 pid(并写入指定的文件):

    myCommand && pid=$!
    myCommand & echo $! >/path/to/pid.file

    注意,在脚本中执行 $! 只会显示子 Shell 的后台进程 pid,如果子 Shell 先前没有启动后台进程,则没有输出。

    查看指定进程是否存在

    在获取到 pid 之后,还可以根据 pid 查看对应的进程是否存在(运行),这个方法也可以用于 kill 指定的进程。

    if ps -p $PID > /dev/null
    then
       echo "$PID is running"
       # Do something knowing the pid exists, i.e. the process with $PID is running
    fi

    本文转载自:https://www.cnblogs.com/lovychen/p/6211209.html

    展开全文
  • Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过ll或ls–l命令即可查看。 ll/proc/PI...
  • Linux下获取已知启动命令的进程PID,并杀掉进程
  • 通过ps及top命令查看进程信息时...Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过ll或ls –l命令即可查看。
  • Linux进程PID分配

    2019-02-05 17:37:24
    struct pid在内核内部...下面我们基于Linux4.20看下进程pid是如何分配的,首先看下进程pid相关的数据结构: 进程数据结构中的namespace成员: struct task_struct { … … /* Namespaces: */ struct nsprox...
  • Linux查看进程PID信息

    2019-07-06 04:16:38
    Linux在启动程序时会在 /proc/PID 目录下以PID为名称创建一个文件存储相关进程信息 查号码首选chm云平台,来自云端的力量 转载于:https://www.cnblogs.com/mengdejun/p/linux_ps_pid_information.html...
  • Linux获取进程pid

    2016-03-16 19:26:02
    -/proc是系统中当前运行的所有进程的对应目录,以进程PID号为目录名,可用来获取进程信息。 -/proc/pid/comm是对应pid号的进程名。
  • tatus文件,第一行的Name即为进程名,C程序实现根据PID获取进程名和根据进程名获取PID,大家参考使用吧 Liunx中通过进程名查找进程PID可以通过 pidof [进程名] 来查找。反过来 ,相同通过PID查找进程名则...
  • 一、进程pid 进程pid由getpid()函数获取...线程pid由syscall(SYS_gettid)获取,在Linux中POSIX线程库实现的线程其实也是一个进程(LWP)。既然线程实际上也是一个“进程”,那么线程也会有一个pid,这个线程pid在整...
  • 今天pycharm卡死,无法手动关闭,于是使用进程号在终端进行关闭 ps -aux | grep pycharm 一般第一个就是pycharm主进程pid 直接 kill -9 pid 就OK了
  • Linux 精准获取进程pid

    2016-12-03 13:06:54
    Linux 精准获取进程pid 如果想在脚本里只获取PID,那么可以用如下脚本。目前收集两种方法:   方法一 $ps x|grep xxx |awk '{print $1}'   e.g.  ps x|grep java |awk '{print $1}' 注释:  1...
  •  在linux根目录中,有一个/proc的VFS(虚拟文件系统),系统当前运行的所有进程都对应于该目录下的一个 以进程PID命名的文件夹 ,其中存放进程运行的N多信息。其中有一个status文件,cat显示该文件, 第一行的Name 即...
  • 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一。该数据结构在内核文件 include/linux/...
  • 在我的另外一个篇博客【Linux下C语言开发(信号signal处理机制)】中需要测试系统调用kill来向指定进行号发送指定的信号,在同一个测试文件很容易获取当前进程pid,只需调用getpid()函数就可获取当前进程pid。...
  • 比如查找与python相关的进程pid $ ps -ef | grep python 就会输出 这样就可以很容易看到,程序 python /home/chencancan/PThyroidC/preprocess/extract_patches.py 的pid为36273 如果要杀死这个进程,使用...
1 2 3 4 5 ... 20
收藏数 252,297
精华内容 100,918
关键字:

linux 获得子进程pid