我有一条命令,比如说php process.php
。我想运行此命令的 1000 个实例来测试对服务器造成的负载。我该怎么做?
注意事项:
Ctrl+C应立即终止所有实例
它将在单核处理器上运行,因此不需要多线程等高级功能。
很高兴在顶部显示当前正在运行的实例数量
命令应该在同一个终端输出
命令无需输入
答案1
您可以使用脚本。将以下内容另存为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
设置在收到信号(即按下 时生成的信号)时运行的命令CtrlC。$$
是当前进程(即脚本本身)的 PID。pkill -P $$
终止父进程为脚本的进程。- 按照惯例,捕获了 的程序在清理完毕后会
SIGINT
自行终止。因此, 。SIGINT
kill -INT $$
seq 1000
生成从 1 到 1000 的数字。- 循环
while
针对每个数字运行一次作为脚本参数提供的命令seq
,然后将它们发送到后台。 - 然后我们
wait
直到所有后台进程都执行完毕。
运行如下:
./run-parallel.sh php process.php
答案2
您可以使用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
被告知启动最多 100 个并行命令(-P 100
)。-I {}
告知用其输入xargs
替换字符串{}
。因此,php {}
扩展为php /path/to/process.php
。由于一切都由 完成xargs
,因此单个Ctrl+C将终止所有命令,并且所有输出都将打印到同一终端。
答案3
你可以写一个Master程序来启动1000次php process.php
。如果你用C语言,使用fork
和exec
可能会很方便。当Master启动一个新php
进程时,它也会记录它的pid
。
显示当前正在运行的实例数:Master可以监控子进程的状态。
Ctrl+C 应该立即终止所有实例:Master 捕获 Ctrl+C 信号,并终止所有子进程(kill(pid, SIGKILL);
)或通知它们退出。