加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 在shell中运行一个进程池

发布时间:2020-12-13 17:20:22 所属栏目:Linux 来源:网络整理
导读:我正在寻找一种简单的方法,可以使用一个命令同时运行N个选定的进程.当我用ctrl c退出时,它应该将所有输出放在我的终端上并关闭所有输出.有没有现有的应用程序这样做? 我正在考虑像exec_many 10 foo这样的东西 – 它应该保持10个foos运行并重生任何死亡. 解
我正在寻找一种简单的方法,可以使用一个命令同时运行N个选定的进程.当我用ctrl c退出时,它应该将所有输出放在我的终端上并关闭所有输出.有没有现有的应用程序这样做?

我正在考虑像exec_many 10 foo这样的东西 – 它应该保持10个foos运行并重生任何死亡.

解决方法

我不知道有一个副手,但你可以用 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 System Adminsitration的“Proccesses and Concurrency”部分找到类似的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读