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

时间:2013-02-28 15:18:26

标签: linux bash

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

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 

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

2 个答案:

答案 0 :(得分:6)

添加:

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 -c 0 prog1 -option1 > log1完成后,脚本将退出,它将终止它启动的所有后台进程。

答案 1 :(得分:0)

在大多数系统中如何使用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

使用此命令,两个命令都并行运行,直到其中一个命令死亡后才退出。如果其中一个死亡,它将杀死父PPID,并在那里也杀死其他姐妹作业/处理作业

我用它来解决CloudFoundry中的一个问题,以便同时启动2个进程,并且不会违反应用程序死机的规则,否则该规则会使容器崩溃

answers here

致敬