我想这个标题会给你这个想法。
另一个重复的问题
好吧,让我详细解释一下。
好的,我们走了。
我正在使用gearman来处理一堆任务。我有一个齿轮手客户端,将此任务发送给工人。要同时运行这些任务,必须有更多的工作人员一次处理任务。目前,我按照cpus的数量创建工作人员。就我而言,它是4
。所以, 4个流程。
./worker & ./worker & ./worker & ./worker
。
我有同时运行的文件。但是,我没有各自的PID&他们的退出代码状态。 我希望他们永远奔跑。此外,此过程不会在控制台上输出任何内容,因为它们与 客户端 - 工作者样式 进行通信。最大的问题是保持终端运行。请记住,我希望这些过程永远运行。
现在,为了解决这个问题,我决定创建一个 Upstart服务,它在后台运行这个过程。但是,我想确保我的所有员工都在运行。然后我遇到了 gnu-parallel 这似乎是一个完美的工具。我无法找到完美的命令。而且,我没有时间去探索这一切。
所以,我想做以下几点。
seq 8 | parallel -n0 ./worker
这是我的新贵服务
# 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名员工在后台服务中保持活力?
提前致谢。
答案 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 $!