并行运行程序的多个实例

我有一个命令,让我说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,使用forkexec可能很方便。当Master启动一个新的php进程时,它也会记录它的pid

显示当前运行实例的数量:主服务器可以监控子进程的状态。

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