Linux/Unix Bash 脚本如何知道自己的 PID?
Posted
技术标签:
【中文标题】Linux/Unix Bash 脚本如何知道自己的 PID?【英文标题】:How does a Linux/Unix Bash script know its own PID? 【发布时间】:2011-01-30 10:06:22 【问题描述】:我在 Bash 中有一个名为 Script.sh
的脚本,它需要知道自己的 PID(即我需要在 Script.sh 中获取 PID)
知道怎么做吗?
【问题讨论】:
【参考方案1】:使用$BASHPID
或$$
请参阅 [手册][1] 了解更多信息,包括两者之间的差异。
TL;DRTFM
$$
扩展为 shell 的进程 ID。
在()
子shell 中,它扩展为调用shell 的进程ID,而不是子shell。
$BASHPID
扩展为当前 Bash 进程的进程 ID(bash 4 的新功能)。
在()
子shell 中,它扩展为子shell 的进程ID
[1]:http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables
【讨论】:
【参考方案2】:变量$$
包含PID。
【讨论】:
【参考方案3】:您可以使用$$
变量。
【讨论】:
【参考方案4】:PID 存储在$$
。
示例:kill -9 $$
将终止调用它的 shell 实例。
【讨论】:
kill -9
(带有-9
标志)被认为是有害的,只有在绝对必要时才使用)。
它被认为是“危险的”,因为进程没有机会响应信号(并且可能会自行清理)。做kill -9 $$
只做一件事。它会杀死 当前的 shell 进程。如果您在 shell 会话中做了一些不想写入 .bash_history
的操作,这很有用,例如:docker run -e PASSWORD=hunter2 ircbot
【参考方案5】:
除了 Jefromi 引用的Advanced Bash Scripting Guide 中给出的示例之外,这些示例还展示了管道如何创建子外壳:
$ 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
【讨论】:
你能解释一下“ 它将字符串重定向到循环中(或任何读取stdin
的内容)。该字符串被称为“此处字符串”。【参考方案6】:
如果进程是子进程且没有设置$BASHPID,则可以查询正在运行的进程创建的子进程的ppid。它可能有点难看,但它有效。示例:
sleep 1 &
mypid=$(ps -o ppid= -p "$!")
【讨论】:
【参考方案7】:无论您身在何处(在交互式命令行或脚本中),如果您无权访问 $BASHPID,您都可以通过以下方式访问您当前的 shell pid:
bash -c 'echo $PPID'
其中简单的引号对于防止过早的字符串解释是必不可少的(以确保解释发生在子进程中,而不是当前进程中)。 原理就是创建一个子进程并询问其父pid,即“我自己”。 此代码比基于 ps 的 Joakim 解决方案更简单。
【讨论】:
以上是关于Linux/Unix Bash 脚本如何知道自己的 PID?的主要内容,如果未能解决你的问题,请参考以下文章