并行运行并等待subshel​​l的处理

时间:2020-07-14 10:02:25

标签: linux bash shell sh pid

大家好/我正在尝试为外壳制作类似 parallel 的工具,只是因为 parallel 的功能不足以满足我的任务。原因是我需要运行不同版本的编译器。 想象一下,我需要用不同的编译器来编译12个程序,但是我只能同时运行其中的4个(否则PC内存不足并崩溃:)。我还希望能够观察每个编译的过程,因此我在新窗口中执行每个编译。 为了使操作更容易,我将用小的脚本替换运行的编译器,该脚本等待并返回进程ID sleep.sh

esp

因此主脚本应类似于 parallel_run.sh

ebp

问题在于使用$!我得到xfce4-terminal的pid,而不是它执行的程序。因此,如果我看一下第一次迭代的 ptree ,我可以看到主脚本的输出:

#!/bin/bash
sleep 30 
echo $$

sleep.sh 表示当时具有 pid = 30876 。因此,在这种情况下,等待根本不起作用。

问:如何获取在子Shell中运行的编译器的正确PID? 也许还有另一种方法可以解决这样的任务?

1 个答案:

答案 0 :(得分:0)

如果您在新的xfce4-terminal中调用进程,因为终端进程在执行给定命令后立即死亡,则似乎无法从父级到子级跟踪PID。因此,我得出的解决方案并不完美,但在我的情况下可以接受。我运行并将编译器的进程放在后台,然后将输出重定向到.log文件。然后在这些日志文件上运行 tail ,并在完成当前批处理的编译器时杀死属于当前$ USER的所有尾部,然后运行另一个批处理。

#!/bin/bash
for i in {1..8}; do
  ./sleep.sh > ./process_$i.log &
  prcid=$!
  xfce4-terminal -e "tail -f ./process_$i.log" &
  pids[$i]=$prcid
  if (( $i % 4 == 0 ))
  then
    for pid in ${pids[*]}; do 
      wait $pid
    done
  killall -u $USER tail
  fi
done

希望那时不会再有其他 tails 了:)

相关问题