这看起来像是Get pid of function executed in background的副本,但事实并非如此。接受的答案是脚本父进程ID。
以下脚本:
#!/bin/bash
function foo {
# I want to know my PID
echo foo PID=$$
echo foo PPID=$PPID
sleep 1
}
echo Script PID=$$
echo Script PPID=$PPID
foo &
echo job PID=$!
ps -fH
wait
产生以下输出:
Script PID=3694
Script PPID=27899
job PID=3695
foo PID=3694
foo PPID=27899
UID PID PPID C STIME TTY TIME CMD
fred 27899 6622 0 11:03 pts/10 00:00:00 /bin/bash
fred 3694 27899 0 15:10 pts/10 00:00:00 /bin/bash /tmp/test
fred 3695 3694 0 15:10 pts/10 00:00:00 /bin/bash /tmp/test
fred 3697 3695 0 15:10 pts/10 00:00:00 sleep 1
fred 3696 3694 99 15:10 pts/10 00:00:00 ps -fH
由于foo()在后台运行,我希望在foo中使用$$来计算其PID(3695),但它不会计算到调用脚本PID(3694)。
在函数foo中,我如何获得自己的PID?
更新:根据要求将ps -fp $!
更改为ps -fH
答案 0 :(得分:2)
在对函数进行背景化时,Bash可能会使用子shell。 PPID
和BASHPID
变量不会更改,但如果您回显bash `other_script`
变量,您会看到它在您的函数内发生变化。
我认为你看到的行为是有意的,但与shell发布的永恒程序相比,函数的行为方式不同。
您可以通过将函数中的代码放在单独的脚本中并使用
调用它来强制启动单独的进程export
无论你使用什么shell,都应该创建一个新的进程。
您需要Route::get('some/link/{link}' [
'as' => 'pages.link',
'uses' => 'controller@function'
]);
孩子所需的任何变量,并且无法对孩子中父母可见的变量进行分配。
答案 1 :(得分:0)
我找到了一种简单的方法,可以同时适用于bash和ksh(以及可能的其他shell)。
$SHELL -c 'echo $PPID'
当调用上面的命令时,PPID被设置为调用进程,恰好是函数foo。