大家好/我正在尝试为外壳制作类似 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? 也许还有另一种方法可以解决这样的任务?答案 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 了:)