在shell中运行一个进程池

我正在寻找一种简单的方法,用一个命令同时运行N选定的进程。 它应该把所有的输出在我的terminal,并closures所有的时候我用ctrl+c退出。 有没有现有的应用程序这样做?

我在想exec_many 10 foo这样的东西 – 它应该保持10个foo的运行,并重生任何死亡。

我不知道一个人是谁,但是你可以用Bash做这个,而不需要太多的工作。 我会把每个foo进程放到一个进程组中。 然后,您可以在父级中捕获SIGINT,并使用kill -pgid (进程组编号之前的负数)来kill -pgid进程组。 你也可以把它们都作为工作来启动。 所以他们都马上跑(很多)。 最后,如果计数小于foo进程的数量,则可以每隔x秒循环输出一次作业(循环中的hibernate)并获得计数,然后再打开另一个进程(可以通过制作更多的幻灯片确定没有人停止等)。

一个粗糙的版本可能是这样的:

 #!/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”部分find类似的东西。

从突触….

并行构build并执行标准input的命令行

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

如果你今天使用xargs,你会发现GNU Parallel非常容易使用。 如果你在shell中编写循环,你会发现GNU Parallel可以replace大部分的循环,并且通过并行运行作业使它们运行得更快。 如果您使用ppss或pexec,您会发现GNU并行将经常使命令更容易阅读。

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