命令行命令/命令運行時的pid及獲取


命令行輸入的命令,和命令運行時的PID並不是同一個。

 

例如有如下一段代碼perf_test.py:

 1 import subprocess
 2 import time
 3 import os
 4 import signal
 5 
 6 cmd = "sudo perf record -e cpu-clock -g -p {} -o perf_{}.data".format(os.getpid(), os.getpid())
 7 print(cmd)
 8 p = subprocess.Popen(cmd, shell=True)
 9 print("cur process pid: {}".format(os.getpid()))
10 print("cur process's parent process pid: {}".format(os.getppid()))
11 
12 print("subprocess pid: {}".format(p.pid))
13 print("session pid which subprocess exist in: {}".format(os.getsid(p.pid)))
14 print("subprocess's group pid: {}".format(os.getpgid(p.pid)))
15 
16 time.sleep(10)
17 get_cmd_pid = "pgrep '{}'".format('perf')
18 cmd_pid = os.popen(get_cmd_pid).read()
19 print("{} : {}".format(get_cmd_pid, cmd_pid))
20 
21 os.kill(p.pid, signal.SIGINT)

 

(1)在命令行輸入:$ sudo python perf_test.py,打印如下:

sudo perf record -e cpu-clock -g -p 9621 -o perf_9621.data
cur process pid: 9621
cur process's parent process pid: 9620
subprocess pid: 9622
session pid which subprocess exist in: 22480
subprocess's group pid: 9620
pgrep 'perf' : 9624

 

(2)待perf_test.py運行起來后,運行結束前,在另一terminal中查看perf pid:

$ pgrep "perf"

9624

$ ps a

PID TTY STAT TIME COMMAND
9620 pts/20 S+ 0:00 sudo python perf_test.py
9621 pts/20 S+ 0:00 python perf_test.py
9622 pts/20 S+ 0:00 /bin/sh -c sudo perf record -e cpu-clock -g -p 9621 -o perf_9621.data
9623 pts/20 S+ 0:00 sudo perf record -e cpu-clock -g -p 9621 -o perf_9621.data
9624 pts/20 S+ 0:00 /usr/lib/linux-tools/4.15.0-107-generic/perf record -e cpu-clock -g -p 9621 -o perf_9621.data
9629 pts/19 R+ 0:00 ps a
22480 pts/20 Ss 0:01 bash

可見:

(a)PID9620的COMMAND恰好是(1)中命令行的輸入。

(b)PID9621是perf_test.py運行時的PID,從(1)打印看即示例代碼中os.getpid()的獲取值。而且從(1)的打印看9620恰是9621的父PID。

(c)示例代碼中使用subprocess啟動了一個命令,該命令行的PID是9622,從(1)和(2)可以看到。同時從(2)可見,該命令行與命令的實際運行/內核運行都有不同的PID

(d)使用pgrep 'perf'獲取的是內核運行的PID

 

參考:

https://blog.csdn.net/eydwyz/article/details/106475953

https://www.cnblogs.com/lcword/p/6046261.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM