Ron*_*Ron 5 bash process background-process
我在 RH Linux 系统上使用 bash。
通常,您可以使用变量 $$ 获得自己的 PID。但是,如果脚本将其自己的功能之一作为后台进程运行 - 这将不起作用;使用 $$ 时,所有在后台运行的函数都会获取父脚本的 PID。
例如,这是一个测试脚本:
/tmp/test:
#!/bin/bash
echo "I am $$"
function proce {
sleep 3
echo "$1 :: $$"
}
for x in aa bb cc; do
eval "proce $x &"
echo "Started: $!"
done
Run Code Online (Sandbox Code Playgroud)
执行时:
/tmp$ ./test
I am 5253
Started: 5254
Started: 5256
Started: 5258
/tmp$ aa :: 5253
bb :: 5253
cc :: 5253
Run Code Online (Sandbox Code Playgroud)
所以 - 父脚本 (/tmp/test) 作为 PID 5253 执行并用 PID 5254、5256 和 5258 触发三个后台进程。但是这些后台进程中的每一个都使用 $$ 获得值 5253。
这些进程如何发现其实际 PID?
小智 9
$BASHPID
可能是您正在寻找的。
BASHPID
扩展为当前 Bash 进程的进程 ID。这在某些情况下与 $$ 不同,例如不需要重新初始化 Bash 的子 shell。
与 $$
($$) 扩展到 shell 的进程 ID。在 () 子shell 中,它扩展为调用shell 的进程ID,而不是子shell。
http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables
与bash
:
echo "$BASHPID"
Run Code Online (Sandbox Code Playgroud)
会给你评估该echo
命令的进程的pid
请注意(例如在 a 之后enable -n echo
)它不一定与运行该echo
命令的进程的 pid 相同。
bash
(或任何外壳)用进程做自己的汤。尝试猜测什么进程做什么并不总是有用的。
$ readlink -f /proc/self "/proc/$BASHPID"
/proc/30868
/proc/30747
$ (readlink -f /proc/self "/proc/$BASHPID")
/proc/30869
/proc/30869
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,readlink
在解释命令行的同一进程中执行,因为这是在该子shell中运行的最后一个命令(因此bash
优化了 a fork()
)。
的zsh
当量是在zsh/system
模块:
$ zmodload zsh/system
$ echo $$ $sysparams[pid]
5155 5155
$ (echo $$ $sysparams[pid])
5155 30979
Run Code Online (Sandbox Code Playgroud)
(zsh
还公开了子shell的父pid $sysparams[ppid]
)。
便携,你可以这样做:
pid=$(sh -c 'echo "$PPID"')
Run Code Online (Sandbox Code Playgroud)
所有 shell 都应该将它sh
作为解释该命令行的子 shell 的直接子级运行,因此sh
's$PPID
应该是那个子shell。
归档时间: |
|
查看次数: |
3092 次 |
最近记录: |