在 shell 中运行进程池

vir*_*tor 5 linux process pool

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

我在想一些事情exec_many 10 foo- 它应该保持 10foo秒的运行并重生任何死亡的人。

Kyl*_*ndt 5

我不知道有什么办法,但是你可以用 Bash 做到这一点,而无需做太多工作。我会将每个 foo 进程放在一个进程组中。然后,您可以在父进程中捕获 SIGINT 并使用kill -pgid(Negative before process group number) 终止进程组。您也可以将它们全部作为作业启动。所以它们都同时运行(几乎)。最后,您可以每 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
Run Code Online (Sandbox Code Playgroud)

您还可以在 Pythton for Unix and Linux System Adminsitration 的“进程和并发”部分找到类似的内容。