并行运行程序的多个实例
我有一个命令,让我说php process.php
。 我想运行此命令的1000个实例来测试服务器上的负载。 我怎样才能做到这一点?
注意事项:
-
Ctrl + C应立即终止所有实例
-
它将在单核处理器上运行,因此不需要像multithreading那样的高级function。
-
很高兴在顶部显示当前运行的实例数
-
命令应该在同一个终端输出
-
命令不需要输入
你可以使用xargs
。 只需打印您想要的过程名称100次并将其传递给xargs
:
perl -e 'print "/path/to/process.php\n" x 100' | xargs -P 100 -I {} php {}
Perl命令只打印/path/to/process.php
后跟换行符100次。 然后将其传递给xargs
,告知xargs
启动多达100个并行命令( -P 100
)。 -I {}
告诉xargs
用它的输入替换字符串{}
。 因此, php {}
扩展为php /path/to/process.php
。 由于所有操作都是由xargs
完成的,因此单个Ctrl + C将终止所有这些操作,并且所有输出都将打印到同一个终端。
你可以使用一个脚本。 将以下内容保存为run-parallel.sh
,并使其可执行( chmod +x run-parallel.sh
):
#! /bin/bash trap "pkill -P $$; kill -INT $$" INT while read n do "$@" & done < <(seq 1000) wait
说明:
-
trap ... INT
设置接收SIGINT
信号时要运行的命令(这是按Ctrl C时生成的信号)。 -
$$
是当前进程的PID(即脚本本身的PID)。pkill -P $$
杀死那些父进程是脚本的进程。 -
SIGINT
,捕获SIGINT
的程序一旦整理就会使用SIGINT
自行杀死它。 因此,kill -INT $$
。 -
seq 1000
生成1到1000之间的数字。 -
while
循环为seq
每个数字运行一次作为脚本参数提供的命令,并将它们发送到后台。 - 然后我们
wait
所有后台进程完成执行。
运行它:
./run-parallel.sh php process.php
你可以编写一个Master程序来启动1000次php process.php
。 如果使用C,使用fork
和exec
可能很方便。当Master启动一个新的php
进程时,它也会记录它的pid
。
显示当前运行实例的数量:主服务器可以监控子进程的状态。
Ctrl + C应该立即终止所有实例:Master捕获Ctrl + C信号,并杀死所有子进程( kill(pid, SIGKILL);
)或通知它们退出。