Bash-linux:并行启动多个程序,并在一个程序完成后停止所有程序

Bash-linux:并行启动多个程序,并在一个程序完成后停止所有程序,linux,bash,Linux,Bash,我正在Ubuntu上工作,我想创建一个bash文件来完成这些事情: 在core 1上启动一个程序(prog0)。 等待3秒钟。 然后记录prog0的CPU和内存使用信息(我使用core 0上的两个pidstat实例记录该信息) 然后在核心0上启动另一个程序(prog1)。 当prog1完成时(我认为prog1自动退出),我想退出前面的所有过程(prog0和两个pidstat)。 我不知道如何退出或终止prog1完成时启动的所有进程。添加: trap 'kill $(jobs -p)' EXIT

我正在Ubuntu上工作,我想创建一个bash文件来完成这些事情:
在core 1上启动一个程序(prog0)。
等待3秒钟。
然后记录prog0的CPU和内存使用信息(我使用core 0上的两个pidstat实例记录该信息)
然后在核心0上启动另一个程序(prog1)。
当prog1完成时(我认为prog1自动退出),我想退出前面的所有过程(prog0和两个pidstat)。

我不知道如何退出或终止prog1完成时启动的所有进程。

添加:

trap 'kill $(jobs -p)' EXIT
到脚本的开头。这将在脚本退出时终止所有后台作业


要创建脚本,请打开新文件并将以下内容粘贴到其中:

#!/bin/bash
trap 'kill $(jobs -p)' EXIT
taskset -c 1 prog0 -option0 &
sleep 3
taskset -c 0 pidstat 1 -C prog0 -u > log2 &
taskset -c 0 pidstat 1 -C prog0 -r > log3 &
taskset -c 0 prog1 -option1 > log1
将文件另存为
runme.sh

使其可执行:
chmod+x runme.sh

通过执行以下命令运行它:
/runme.sh
或在后台运行:
/runme.sh&


现在,当最后一个命令
taskset-c0prog1-option1>log1
完成时,脚本将退出,并将终止它启动的所有后台进程。

使用xargs怎么样?xargs是大多数系统中的基本linux程序

xargs -P 2 -I {} sh -c 'eval "$1"' - {} <<EOF
LD_LIBRARY_PATH=$HOME/vendor/usr/lib $HOME/vendor/usr/sbin/pgbouncer -v $HOME/vendor/etc/pgbouncer/pgbouncer.ini ; kill -15 $PPID
nameko run --config config.yaml $@ ; kill -15 $PPID
EOF

xargs-p2-I{}sh-c'eval“$1”{}使用$!环境变量,以便在执行命令时跟踪PID。然后您可以在末尾杀死-9它们。当我手动退出(ctr+c)时,这个命令会杀死所有进程。我希望能够在prog1结束时自动退出并终止所有进程。您应该将命令放在脚本中,在所有其他命令之前使用
trap
,然后运行脚本。您的命令位于脚本顶部,但pidstat是一个循环,不会停止。我需要在prog1结束时自动停止或在prog1结束时退出。我不知道这是否清楚。我已经更新了我的答案,向你展示了如何将其放入脚本中。+1@dogbane这是我见过的最简单的解决方案。好消息。
xargs -P 2 -I {} sh -c 'eval "$1"' - {} <<EOF
LD_LIBRARY_PATH=$HOME/vendor/usr/lib $HOME/vendor/usr/sbin/pgbouncer -v $HOME/vendor/etc/pgbouncer/pgbouncer.ini ; kill -15 $PPID
nameko run --config config.yaml $@ ; kill -15 $PPID
EOF