我对如何通过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次。所以,如果这是一个正确的方法,我想绝对确定。
答案 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