如何捕获后台进程的PID

时间:2018-05-29 09:00:51

标签: bash unix pid

我对如何通过BASH shell分配PID感到困惑,所以我需要你的帮助来解决这个问题我想在这里解决这个问题。我在shell脚本中调用一个函数。此函数在后台运行另一个groovy脚本,如下所示:

fn_list()
{
... ... ... 
groovy list_gn.gy -p $prop_file $@ &
echo "Extracting PID No :$!" >> $logpid
}

我在循环中调用这个函数:

for x in `cat $list | grep -v '#'`; do
fn_list &
echo "Extracting function PID No :$!" >> $logpid
done

因为我在后台运行此函数,并且此函数运行的groovy在后台运行(使用&)。

我的问题是我正在记录函数的PID,我也记录了从该函数内部调用的groovy脚本的PID。函数的PID和从函数内部调用的groovy会不同吗?这是记录PID的正确方法吗?

我需要了解它的行为,因为我计划将函数进程分叉3次。所以,如果这是一个正确的方法,我想绝对确定。

1 个答案:

答案 0 :(得分:1)

实际上pid不是由bash分配的,而是由操作系统分配的,当一个进程被分叉时,它被赋予一个新的pid,从bash进程调用groovy .. &会在bash进程中创建一个新的子进程groovy父进程。 / p>

bash函数调用不会创建新的pid,因为它在内置命令的同一进程中运行。

然而,由于函数调用后的&会创建一个新的bash进程(子shell),因此可能不需要两个&中的一个。

如果您对这些过程的结果感兴趣,您可能需要等待它们的执行,这就是wait内置的功能,并行执行可以查看。

pids=()
for ... ; do
    groovy ... &
    pids+=( "$!" )
done

exit_codes=()
for pid in "${pid[@]}"; do
    wait "$pid"
    exit_codes+=( "$?" )
done