我有一个命令,比如说php process.php
。我想运行此命令的 1000 个实例来测试服务器上引起的负载。我怎样才能做到这一点?
注意事项:
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
Run Code Online (Sandbox Code Playgroud)
解释:
trap ... INT
设置在SIGINT
接收到信号时运行的命令(按下 时生成的信号CtrlC)。$$
是当前进程(即脚本本身)的 PID。pkill -P $$
杀死那些父进程是脚本的进程。SIGINT
就使用SIGINT
它来杀死自己。因此,kill -INT $$
.seq 1000
生成从 1 到 1000 的数字。while
循环运行一次用于从每个数字提供作为参数传递给脚本的命令seq
,并且将它们发送到背景中。wait
直到所有后台进程执行完毕。运行它:
./run-parallel.sh php process.php
Run Code Online (Sandbox Code Playgroud)
您可以使用xargs
. 只需打印您想要的进程名称 100 次并将其传递给xargs
:
perl -e 'print "/path/to/process.php\n" x 100' | xargs -P 100 -I {} php {}
Run Code Online (Sandbox Code Playgroud)
Perl 命令只打印/path/to/process.php
100 次后跟换行符。然后将xargs
其传递给它,告诉它启动多达 100 个并行命令 ( -P 100
)。该-I {}
通知xargs
替换的字符串{}
,其输入。因此,php {}
扩展为php /path/to/process.php
. 由于一切都是由 完成的xargs
,一个Ctrl+C将杀死所有这些,并且所有输出都打印到同一个终端。
小智 0
你可以写一个Master程序来启动1000次php process.php
。如果使用 C,使用fork
和exec
可能会很方便。当 Master 启动一个新php
进程时,它也会记录它的pid
.
显示当前运行实例的数量:Master可以监控子进程的状态。
Ctrl+C 应该立即终止所有实例:Master 捕获 Ctrl+C 信号,并杀死所有子进程 ( kill(pid, SIGKILL);
) 或通知它们退出。