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 这似乎是一个完美的工具。我找不到完美的命令。而且,我没有时间去探索这一切。
所以,我想做以下事情。
- 在 upstart 中使用 gnu-parallel 来执行并发 worker。我拥有的
现在是这段代码。
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
我需要在上面的代码中并行实现。
以上代码中的缺陷在于,如果最后一个工作进程被杀死,它 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 $!
我想标题给了你这样的想法。
Another duplicate question
好吧,让我详细解释一下。
好的,我们开始。
我正在使用 gearman 来处理一堆任务。我有一个 gearman 客户将这个任务发送给工人。要 运行 这些任务并发,必须有更多的工人同时处理一个任务。目前,我根据 CPU 数量创建工人。就我而言,它是 4
。所以,4 个进程。
./worker & ./worker & ./worker & ./worker
.
我同时拥有相同的文件 运行ning。但是,我没有他们各自的 PID 和他们的退出代码状态。 我希望他们永远 运行。此外,此进程不会在控制台上输出任何内容,因为它们通信 client - worker style。而且最大的问题是要保持终端运行ning。记住,我希望这个过程永远 运行ning。
现在,为了解决这个问题,我决定创建一个 Upstart 服务,运行 这个服务在后台处理。但是,我想确保我所有的工人都 运行ning。然后我遇到了 gnu-parallel 这似乎是一个完美的工具。我找不到完美的命令。而且,我没有时间去探索这一切。
所以,我想做以下事情。
- 在 upstart 中使用 gnu-parallel 来执行并发 worker。我拥有的
现在是这段代码。
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
我需要在上面的代码中并行实现。
以上代码中的缺陷在于,如果最后一个工作进程被杀死,它 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 $!