从shell脚本中的后台函数中获取PID

时间:2017-01-17 13:09:32

标签: bash shell ksh

这看起来像是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

2 个答案:

答案 0 :(得分:2)

在对函数进行背景化时,Bash可能会使用子shell。 PPIDBASHPID变量不会更改,但如果您回显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。