5

我在 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 完成后启动的所有进程。

4

2 回答 2

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完成时,脚本将退出并杀死它启动的所有后台进程。

于 2013-02-28T15:37:05.660 回答
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 个进程,而不是无视如果应用程序进程死亡,它应该使容器崩溃的规则

在这里向答案致敬

于 2019-11-01T16:27:12.070 回答