如何查看当前正在运行的命令的 PID?

如何查看当前正在运行的命令的 PID?

在阅读有关 Linux 的文章时,我得到了:

默认情况下,脚本中创建的变量仅对当前 shell 可用;子进程(子 shell)将无法访问已设置或修改的值。要允许子进程查看这些值,需要使用 export 命令。

我尝试查找有关子壳的信息,然后我偶然发现了是否有任何命令可以查看进程如何工作?,我发现 ltrace 可以用于此,当我搜索如何使用ltrace或时strace,我发现这PID是必需的属性。

现在,如果我想知道 PID $ cp file1 file2,我该怎么做?以便我可以使用ltrace它?

答案1

电流指令PID

当您在后台启动命令时,会显示您自己的 shell 中的命令的 PID。如果当前命令在前台运行,shell 通常会等待它完成,我们也必须等待 - 除非我们想使用此 shell 之外的工具;请参阅下面的选项。

作为示例命令,我将使用这个ping命令每 5 秒发送一次请求,共 10 次:

ping -i 5 -c 10 example.com 

现在,我将使用&它在后台运行:

$ ping -i 5 -c 10 example.com &
[1] 12238
$ PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=55 time=118 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=55 time=117 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=55 time=117 ms

告诉[1] 12238我们该进程的进程 ID 为短 PID 12238;并且它是当前在此 shell 中运行的第一个后台作业。

示例:跟踪库调用

在同一个终端中我们得到了输出ping,所以我们最好在另一个终端中运行 ltrace(ping具有特殊的 root 权限,因此我们需要sudo弄乱其内部):

$ sudo ltrace -p 12238      
[sudo] password for siegel: 
gettimeofday(0x7fff7f0b6900, 0)                                           = 0
gettimeofday(0x7fff7f0b68e0, 0)                                           = 0
sendmsg(3, 0x60a300, 2048, 24)                                            = 64
recvmsg(3, 0x7fff7f0b6970, 0, 0)                                          = 84
__printf_chk(1, 0x40813b, 64, 0x60a560)                                   = 29
__printf_chk(1, 0x4077ea, 4, 28)                                          = 11
__printf_chk(1, 0x40814d, 55, 11)                                         = 7
__printf_chk(1, 0x408162, 118, 7)                                         = 12
_IO_putc('\n', 0x7f7836d89400)                                            = 10
fflush(0x7f7836d89400)                                                    = 0
gettimeofday(0x7fff7f0b6900, 0)                                           = 0
poll(0x7fff7f0b6950, 1, 4880, 0)                                          = 0
gettimeofday(0x7fff7f0b6900, 0)                                           = 0
gettimeofday(0x7fff7f0b68e0, 0)                                           = 0
sendmsg(3, 0x60a300, 2048, 24)                                            = 64
recvmsg(3, 0x7fff7f0b6970, 0, 0)                                          = 84
__printf_chk(1, 0x40813b, 64, 0x60a560)                                   = 29
__printf_chk(1, 0x4077ea, 5, 28)                                          = 11
__printf_chk(1, 0x40814d, 55, 11)                                         = 7
__printf_chk(1, 0x408162, 118, 7)                                         = 12
_IO_putc('\n', 0x7f7836d89400)                                            = 10
fflush(0x7f7836d89400)                                                    = 0
gettimeofday(0x7fff7f0b6900, 0)                                           = 0
poll(0x7fff7f0b6950, 1, 4881, 0)      

这是两次“ping”期间库调用的踪迹。


查找正在运行的进程的 PID

由于标题问题不是很具体,这里还有一些其他方法来查找当前正在运行的命令的 PID:

  • 按命令名称搜索进程
    pgrep -x cmd 请注意,变体pgrep cmd是错误的:它作为子字符串

  • 通过带参数的命令行搜索
    pgrep -f cmdarg

  • 列出属于当前 shell(会话)的进程,如后台进程或 shell 本身
    ps -s $$

  • 列出所有进程:“进程状态”
    ps aux

  • 以更具交互性的方式列出进程:“进程表”
    top

  • 您一次性获得所需的一切:一个与 和 集成的流程表:ltracestrace
    htop
    的变体,top具有增强的用户界面和可配置性,以及一些附加功能:
    用光标行选择一个流程,然后Lltrace或!sstrace

答案2

bashdash(以及许多其他 shell)都有用于作业控制的内置命令。如果你在后台运行命令

sleep 9999 &

你可以发现当前shell的所有后台命令:

$ jobs
[1]+  Running                 sleep 9999 &

如果您需要其中一个进程的进程 ID,可以使用 来获取jobs -p %N,其中N是上面作业列表(第一列)中的作业 ID。还有一个特殊变量$!,shell 将用最近在后台执行的命令的 PID 替换它。

有关详细信息和更多选项,请参阅手册的相关部分bash(1)直接链接到 HTML 版本中的作业控制部分),dash(1)或您选择的 shell。TLDP 有一个很棒的作业控制部分也一样。

相关内容