并行运行一个程序的多个实例

Var*_*Agw 5 command-line bash

我有一个命令,比如说php process.php。我想运行此命令的 1000 个实例来测试服务器上引起的负载。我怎样才能做到这一点?

注意事项:

  • Ctrl+C应立即终止所有实例

  • 它将在单核处理器上运行,因此不需要多线程等高级功能。

  • 很高兴在顶部显示当前正在运行的实例数

  • 命令应该在同一个终端输出

  • 命令不需要输入

mur*_*uru 8

你可以使用脚本。将以下内容另存为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)。
  • $$是当前进程(即脚本本身)的 PI​​D。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)


ter*_*don 8

您可以使用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.php100 次后跟换行符。然后将xargs其传递给它,告诉它启动多达 100 个并行命令 ( -P 100)。该-I {}通知xargs替换的字符串{},其输入。因此,php {}扩展为php /path/to/process.php. 由于一切都是由 完成的xargs,一个Ctrl+C将杀死所有这些,并且所有输出都打印到同一个终端。


小智 0

你可以写一个Master程序来启动1000次php process.php。如果使用 C,使用forkexec可能会很方便。当 Master 启动一个新php进程时,它也会记录它的pid.

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

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