在 shell 中运行进程池

在 shell 中运行进程池

N我正在寻找一种简单的方法,使用一个命令同时运行选定的进程。它应该将所有输出放在我的终端上,并在我使用 退出时关闭所有进程ctrl+c。是否有任何现有的应用程序可以做到这一点?

我正在考虑一些事情exec_many 10 foo——它应该保持 10foo秒的运行,并重生任何死亡的。

答案1

我不知道有没有现成的方法,但你可以用 Bash 做到这一点而不需要做太多工作。我会把每个 foo 进程放在一个进程组中。然后,你可以在父进程中捕获 SIGINT 并使用kill -pgid(进程组号前的负数)终止进程组。你也可以将它们全部作为作业启动。所以它们都同时运行(差不多)。最后,你可以每 x 秒循环一次作业的输出(在循环中休眠)并获取计数,如果计数小于 foo 进程的数量,那么你可以启动另一个进程(可以通过确保没有停止等来变得更加花哨)。

粗略的版本可能是这样的:

#!/bin/bash

command=$1
n_job=$2

function kill_jobs {
    echo traped
    for job in $(jobs -p); do
        echo killing $job
        kill $job
    done
} 

trap 'kill_jobs; exit' SIGINT

while true; do
    current_jobs=$(jobs -pr)
    x=0;
    for job in $current_jobs; do
        (( x++ ))
    done;

    jobs_to_run=$(($n_job - $x))

    for (( y = 0; y < $jobs_to_run; y++ )); do
        $command &
    done
    x=0 
    sleep 5
done

您还可以在 Pythton for Unix 和 Linux 系统管理的“进程和并发”部分中找到类似的内容。

答案2

来自突触....

并行从标准输入构建和执行命令行

GNU Parallel 是一个 shell 工具,用于使用一台或多台机器并行执行作业。作业通常是一条命令或一个小脚本,必须针对输入中的每一行运行该脚本。典型的输入是文件列表、主机列表、用户列表或表列表。

如果您现在使用 xargs,您会发现 GNU Parallel 非常易于使用。如果您在 shell 中编写循环,您会发现 GNU Parallel 可能能够替换大多数循环并通过并行运行作业使其运行得更快。如果您使用 ppss 或 pexec,您会发现 GNU Parallel 通常会使命令更易于阅读。

GNU Parallel 还确保命令的输出与您按顺序运行命令时获得的输出相同。这使得可以使用 GNU Parallel 的输出作为其他程序的输入。

相关内容