我有Bash的问题,我不知道为什么。
在shell下,我输入:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
“getpid”是一个获取当前pid的C程序,如:
int main() { printf("%d", (int)getpid()); return 0; }
令我困惑的是:
答案 0 :(得分:168)
$$
被定义为在子shell中返回父进程的进程ID;从“特殊参数”下的手册页:
$扩展到shell的进程ID。在()子shell中,它扩展为当前shell的进程ID,而不是子shell。
在bash
4中,您可以使用BASHPID
获取孩子的进程ID。
~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
答案 1 :(得分:68)
您可以使用以下其中一项。
$!
是最后一个后台进程的PID。kill -0 $PID
检查它是否仍在运行。$$
是当前shell的PID。答案 2 :(得分:22)
$$
是Bash中the current script PID的别名。请参阅differences between $$
and $BASHPID
here,以及包含嵌套级别的其他变量$BASH_SUBSHELL
。答案 3 :(得分:4)
如果您希望C程序打印shell的PID,请尝试getppid()
。
答案 4 :(得分:1)
如果您询问如何获取已知命令的PID,它将类似于以下内容:
如果您已发出以下命令 #发出的命令是***
dd if = / dev / disky of = / dev / disky
然后您将使用:
PIDs=$(ps | grep dd | grep if | cut -b 1-5)
这里发生的事情是将所有需要的唯一字符通过管道传递到一个字段,并且可以使用该字段回显
回显$ PID
答案 5 :(得分:1)
这种获取正确pid的普遍方式
pid=$(cut -d' ' -f4 < /proc/self/stat)
同样好用的子
SUB(){
pid=$(cut -d' ' -f4 < /proc/self/stat)
echo "$$ != $pid"
}
echo "pid = $$"
(SUB)
检查输出
pid = 8099
8099 != 8100
答案 6 :(得分:0)
如果你想要一个简单的 shell 脚本来获取带有变量的最大 PID,请执行此操作
pid=$(cat /proc/sys/kernel/pid_max)
echo $pid
这将打印出最大的 PID。