Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何捕获后台进程的PID_Bash_Unix_Pid - Fatal编程技术网

Bash 如何捕获后台进程的PID

Bash 如何捕获后台进程的PID,bash,unix,pid,Bash,Unix,Pid,我对bashshell如何分配PID有点困惑,所以我需要您的帮助来理解这一点,使用我在这里试图解决的问题。我正在调用shell脚本中的函数。此函数在后台运行另一个groovy脚本,如下所示: fn_list() { ... ... ... groovy list_gn.gy -p $prop_file $@ & echo "Extracting PID No :$!" >> $logpid } 我在循环中这样调用此函数: for x in `cat $list | gre

我对bashshell如何分配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会不同吗?这是记录PIDs的正确方法吗


我需要了解它的行为,因为我计划三次分叉函数过程。因此,我们要绝对确定这是否是一种正确的方法。

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

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

但是,由于函数调用后的&after,这将创建一个新的bash进程子shell,可能不需要这两个中的一个

如果您对这些进程的结果感兴趣,您可能需要等待它们的执行,这就是wait builtin所做的,并行执行可能需要等待

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

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

子进程在各自独立的shell中运行。只要你使用$!你可以安全地获得他们的身份证,并且澄清一下,你逻辑中的两个身份证是不同的谢谢@Nahuel。。。是的,您是对的,不需要在后台调用该函数。我现在只是在编写groovy脚本。等待解决了我的问题。这就是我想确定的。感谢您的反馈。不客气,如果答案能解决问题,请毫不犹豫地接受issue@NahuelFouilleul这看起来很优雅,你知道为什么当我用rsync命令而不是groovy尝试这段代码时,无论执行多少次,pids数组都只包含一个pid吗?@ChenA。谢谢你的评论,看起来rsync本身是分叉的,也许下面的内容会很有趣