Service Fork进程使用gnu并行处理,它捕获单个退出错误并重新启动

Service Fork进程使用gnu并行处理,它捕获单个退出错误并重新启动,service,parallel-processing,upstart,gearman,gnu-parallel,Service,Parallel Processing,Upstart,Gearman,Gnu Parallel,我猜这个标题给了你这个想法 另一个重复的问题 好吧,让我详细解释一下 好了,开始吧 我使用gearman来处理一堆任务。我有一个gearman客户将此任务发送给工人。要同时运行这些任务,一次必须有更多的工作人员来处理任务。目前,我根据CPU的数量创建工人。在我的例子中,它是4。因此,4个进程 /工人和/工人和/工人和/工人 我有相同的文件同时运行。但是,我没有他们各自的PID和退出代码状态。 我希望他们永远跑下去。此外,此进程不会在控制台上输出任何内容,因为它们以客户机-工作人员的方式进行通信。

我猜这个标题给了你这个想法

另一个重复的问题

好吧,让我详细解释一下

好了,开始吧

我使用gearman来处理一堆任务。我有一个gearman客户将此任务发送给工人。要同时运行这些任务,一次必须有更多的工作人员来处理任务。目前,我根据CPU的数量创建工人。在我的例子中,它是
4
。因此,4个进程

/工人和/工人和/工人和/工人

我有相同的文件同时运行。但是,我没有他们各自的PID和退出代码状态。 我希望他们永远跑下去。此外,此进程不会在控制台上输出任何内容,因为它们以客户机-工作人员的方式进行通信。最大的问题是保持终端运行。记住,我希望这个进程永远运行

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

所以,我想做以下几点

  • 在upstart中使用gnu并行来执行并发工作程序。我所拥有的 现在是这个代码<代码>序号8 |并行-无/工人
  • 如果这些工作人员中的任何人崩溃并退出代码>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
workers
+
old
3
workers复活。总共是
7

如何使用gnu并行在后台服务中保持所有4名工作人员的生命

提前感谢。

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

seq 1000000000000 | parallel -N0 --joblog out.log worker
这将为每个CPU核心启动一个工作进程。当工作程序崩溃时,将记录exitcode。但是,PID将不起作用

工作进程不会重新启动,但会启动一个新的工作进程,因此每个CPU核心始终有一个工作进程在运行。当10000000000工人崩溃时,GNU并行将不会启动另一个。如果你认为它太小,就增加10000000000(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 $!

好的!让我试试这个代码。尽快让你知道情况。谢谢。你的解决方案确实有效。但是,如果gnu并行程序死亡。工人们都成了僵尸。此外,该服务还提供了“重生”指令,该指令创建了一组新的工人和僵尸。有没有办法在gnu parallel死的时候杀死所有的工人?或者其他任何避免这种情况的方法?你可以用一个包装器来包装孩子,如果他们看到他们的父项更改为pid 1,就会杀死他们,但这会给你留下同样的问题:如果包装器死了而没有杀死孩子呢?GNU Parallel使用这种技术杀死远程儿童:我可能想说的是:在什么情况下GNU Parallel会死亡?假设您的工作人员每秒崩溃不到一次,并且您确保/tmp($TMPDIR)没有满负荷运行,我很难预测GNU Parallel什么时候会死掉。如果GNU Parallel死掉呢。因为我不能留任何零头。你可以在这篇文章上得到这个想法