首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >叉进程不确定地使用gnu并行来捕获单个退出错误和重生。

叉进程不确定地使用gnu并行来捕获单个退出错误和重生。
EN

Stack Overflow用户
提问于 2017-07-16 11:15:39
回答 1查看 458关注 0票数 2

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

另一个重复的问题

让我详细解释一下。

好了,我们开始吧。

我用变速机来处理一大堆任务。我有个变速工客户把这个任务交给工人。要同时运行这些任务,必须有更多的工作人员一次处理一个任务。目前,我根据cpus的数量创建员工。在我的例子中,它是4。因此,4处理

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

我有相同的文件同时运行。但是,我没有它们各自的PID&它们的退出代码状态。我要他们永远跑。而且,这个进程不会在控制台上输出任何东西,因为它们通信客户端-工作者样式的。最大的问题是保持终端正常运行。记住,我希望这个进程永远运行。

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

所以,我想做以下几件事。

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

这是我的新贵服务

代码语言:javascript
复制
# 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辅助进程重新生成服务。例如。

代码语言:javascript
复制
___________________
Name   |  PID
worker    1011
worker    1012
worker    1013
worker    1014

如果PID 1014比服务被杀死,那么会产生更多的4工人,+,旧的3工人。总共到了7

如何使用gnu-parallel使所有4名工作人员都能在后台服务中存活?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-16 12:02:53

GNU并行具有--joblog,在这里可能会有所帮助:

代码语言:javascript
复制
seq 1000000000000 | parallel -N0 --joblog out.log worker

这将启动每个CPU核心的一个工作人员。当工作人员崩溃时,退出代码将被记录。然而,PID不会。

工作人员将不会被重新启动,但是一个新的工作人员将被启动,因此每个CPU核心总是有一个在运行。当1000000000000名工作人员已经崩溃时,GNU并行将不会启动另一个。如果你认为它太小,就增加1000000000000 (在31700年间,它是每秒一秒钟--这对大多数人来说就足够了,但如果你是火神,事情可能就不一样了)。

如果您真的需要pid,您可能可以这样做:

代码语言:javascript
复制
seq 1000000000000 | parallel -N0 --joblog out.log 'echo $$; exec worker' >pids

如果只需要GNU并行的PID:

代码语言:javascript
复制
seq 1000000000000 | parallel -N0 --joblog out.log worker &
echo $!
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45127927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档