Fork processes indefinetly using gnu-parallel 捕获个别退出错误并重生

Fork processes indefinetly using gnu-parallel which catch individual exit errors and respawn

我想标题给了你这样的想法。

Another duplicate question

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

好的,我们开始。

我正在使用 gearman 来处理一堆任务。我有一个 gearman 客户将这个任务发送给工人。要 运行 这些任务并发,必须有更多的工人同时处理一个任务。目前,我根据 CPU 数量创建工人。就我而言,它是 4。所以,4 个进程

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

我同时拥有相同的文件 运行ning。但是,我没有他们各自的 PID 和他们的退出代码状态。 我希望他们永远 运行。此外,此进程不会在控制台上输出任何内容,因为它们通信 client - worker style。而且最大的问题是要保持终端运行ning。记住,我希望这个过程永远 运行ning。

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

所以,我想做以下事情。

这是我的新贵服务

# 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

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

以上代码中的缺陷在于,如果最后一个工作进程被杀死,它 re-spawns 服务与所有 4 个工作进程。例如。

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

如果 PID 1014 被杀死比服务重生更多 4 工人 +3 工人。总共 7

如何在后台服务中使用gnu-parallel让4个worker全部存活?

提前致谢。

GNU Parallel --joblog 可能对这里有帮助:

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

这将为每个 CPU 核心启动一个 worker。当 worker 崩溃时,将记录退出代码。但是,PID 不会。

worker 不会重新启动,但会启动一个新的 worker,因此每个 CPU 个核心 运行 总会有一个。当 1000000000000 个 worker 崩溃时,GNU Parallel 将不会启动另一个。如果您认为它太小,请增加 1000000000000(它是 31700 年中的每秒 1 - 这对大多数人来说足够了,但如果您是 Vulcan,情况可能会有所不同)。

如果您确实需要 pid,您可以这样做:

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

如果只需要GNU Parallel的PID:

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