我想这个标题给了你这个想法。
另一个重复的问题
让我详细解释一下。
好了,我们开始吧。
我用变速机来处理一大堆任务。我有个变速工客户把这个任务交给工人。要同时运行这些任务,必须有更多的工作人员一次处理一个任务。目前,我根据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名工作人员都能在后台服务中存活?
提前谢谢。
发布于 2017-07-16 12:02:53
GNU并行具有--joblog,在这里可能会有所帮助:
seq 1000000000000 | parallel -N0 --joblog out.log worker这将启动每个CPU核心的一个工作人员。当工作人员崩溃时,退出代码将被记录。然而,PID不会。
工作人员将不会被重新启动,但是一个新的工作人员将被启动,因此每个CPU核心总是有一个在运行。当1000000000000名工作人员已经崩溃时,GNU并行将不会启动另一个。如果你认为它太小,就增加1000000000000 (在31700年间,它是每秒一秒钟--这对大多数人来说就足够了,但如果你是火神,事情可能就不一样了)。
如果您真的需要pid,您可能可以这样做:
seq 1000000000000 | parallel -N0 --joblog out.log 'echo $$; exec worker' >pids如果只需要GNU并行的PID:
seq 1000000000000 | parallel -N0 --joblog out.log worker &
echo $!https://stackoverflow.com/questions/45127927
复制相似问题