fork使用gnu-parallel进行无限制处理,捕获单个退出错误并重新生成

时间:2017-07-16 11:15:40

标签: service parallel-processing upstart gearman gnu-parallel

我想这个标题会给你这个想法。

  

另一个重复的问题

好吧,让我详细解释一下。

好的,我们走了。

我正在使用gearman来处理一堆任务。我有一个齿轮手客户端,将此任务发送给工人。要同时运行这些任务,必须有更多的工作人员一次处理任务。目前,我按照cpus的数量创建工作人员。就我而言,它是4。所以, 4个流程

./worker & ./worker & ./worker & ./worker

我有同时运行的文件。但是,我没有各自的PID&他们的退出代码状态。 我希望他们永远奔跑。此外,此过程不会在控制台上输出任何内容,因为它们与 客户端 - 工作者样式 进行通信。最大的问题是保持终端运行。请记住,我希望这些过程永远运行。

现在,为了解决这个问题,我决定创建一个 Upstart服务,它在后台运行这个过程。但是,我想确保我的所有员工都在运行。然后我遇到了 gnu-parallel 这似乎是一个完美的工具。我无法找到完美的命令。而且,我没有时间去探索这一切。

所以,我想做以下几点。

  • 在upstart中使用gnu-parallel来执行并发工作程序。是)我有的 现在是这个代码。 seq 8 | parallel -n0 ./worker
  • 如果这些工作人员中的任何一个崩溃并退出代码> 0,我想 使用退出代码记录pid并重新启动工作进程。

这是我的新贵服务

# workon

description "worker load"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

script
  cpu="$(nproc)"

  line="./worker"

  for i in `seq 2 ${cpu}`; do
      line="${line} & ./worker"
  done

  sh -c "echo $$ > test.log; ${line}"
end script

我需要在上面的代码中实现 并行

上述代码中的缺陷是,如果最后一个工作程序被杀,它会使用所有4工作进程重新生成服务。例如。

___________________
Name   |  PID
worker    1011
worker    1012
worker    1013
worker    1014

如果PID 1014被杀,则服务重新生成更多4工人+3工作人员。总共有7

如何使用 gnu-parallel 让所有4名员工在后台服务中保持活力?

提前致谢。

1 个答案:

答案 0 :(得分:3)

GNU Parallel --joblog在这里可能会有所帮助:

seq 1000000000000 | parallel -N0 --joblog out.log worker

这将为每个CPU核心启动一个工作程序。当工作人员崩溃时,将记录exitcode。但是,PID不会。

工作程序不会重新启动,但会启动一个新工作程序,因此每个CPU核心始终会运行一个。当100亿工人崩溃时,GNU Parallel将无法启动另一个工作。如果你觉得它太小就增加1000000000000(它在31700年中每秒为1 - 这对大多数人来说已经足够了,但如果你是瓦肯人,事情可能会有所不同。)

如果你真的需要pid,你可以做类似的事情:

seq 1000000000000 | parallel -N0 --joblog out.log 'echo $$; exec worker' >pids

如果您只需要GNU Parallel的PID:

seq 1000000000000 | parallel -N0 --joblog out.log worker &
echo $!