并行运行程序的多个实例

并行运行程序的多个实例

我有一条命令,比如说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 ... INTSIGINT设置在收到信号(即按下 时生成的信号)时运行的命令CtrlC
  • $$是当前进程(即脚本本身)的 PI​​D。pkill -P $$终止父进程为脚本的进程。
  • 按照惯例,捕获了 的程序在清理完毕后会SIGINT自行终止。因此, 。SIGINTkill -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语言,使用forkexec可能会很方便。当Master启动一个新php进程时,它也会记录它的pid

显示当前正在运行的实例数:Master可以监控子进程的状态。

Ctrl+C 应该立即终止所有实例:Master 捕获 Ctrl+C 信号,并终止所有子进程(kill(pid, SIGKILL);)或通知它们退出。

相关内容