Linux / Unix Bash脚本如何知道自己的PID?


149

我在Bash中有一个名为的脚本Script.sh,它需要知道自己的PID(即,我需要在Script.sh中获取PID)。

任何想法如何做到这一点?

Answers:



65

使用$BASHPID$$

有关更多信息,包括两者之间的区别,请参见手册

TL; DRTFM

  • $$ 扩展为外壳的进程ID。
    • ()子外壳程序中,它将扩展为调用外壳程序的进程ID,而不是子外壳程序。
  • $BASHPID 扩展为当前Bash进程的进程ID。
    • ()子shell中,它扩展为该子shell的进程ID

10
请注意,$$和BASHPID并不总是相同的-手册中提到了这一点,这里还有一个更具体的示例:tldp.org/LDP/abs/html/internalvariables.html。区别可能非常重要,因为许多bash构造确实在子shell中运行。
卡斯卡贝尔

@Jefromi-指出 这就是我链接到手册的原因之一。
tvanfosson

2
应当指出,它$BASHPID是BASH 4的新功能。如果您正在使用BASH 3.x,则必须使用$$
Bruno Bronosky,

36

除了Jefromi引用的Advanced Bash脚本指南中给出的示例,这些示例还显示了管道如何创建子外壳:

$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656

您能解释一下“ <<<”是什么意思吗?谢谢。
Sopalajo de Arrierez,2014年

4
它将字符串重定向到循环(或任何读取stdin)中。该字符串称为“此处字符串”。
暂停,直到另行通知。

8

PID存储在中$$

示例:kill -9 $$将终止从其调用的shell实例。


kill -9(带有-9标志)被认为是有害的,仅在绝对必要时才使用)。
Willem Van Onsem 2015年

3
之所以被认为是“危险的”,是因为该过程没有机会响应信号(并且可能在其自身清除之后)。这样kill -9 $$做恰好会做一件事。它终止了当前的shell进程。如果您在shell会话中做了不想写给.bash_historyLike的操作,这将非常有用:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky


0

如果该进程是子进程,并且未设置$ BASHPID,则可以查询正在运行的进程的已创建子进程的ppid。这可能有点难看,但可以。例:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.