我正在运行一个Ubuntu服务器来挖掘加密。它还不是一个非常稳定的硬币,它们的主节点有时会断开连接。发生这种情况时,会因致命错误而导致程序崩溃。
起初我写了一个循环脚本,所以它会在崩溃后继续运行,并在15秒后再试一次:
while true;
do ./miner <somecodetoconfiguretheminer> &&break;
sleep 15
done;
这有效,但效率低下。有时,循环将持续运行30分钟,直到主节点重新启动 - 这将花费我30分钟的散列功率未使用。所以我希望它运行第二个矿工15分钟来开采另一个硬币,然后再次检查第一个矿工是否工作。
所以基本上:开始 - &gt;我的硬币1 - &gt;如果崩溃 - &gt;我的硬币2持续15分钟 - &gt;转到开始
我尝试了下面的脚本,但是一旦第一个矿工断开连接,服务器就会变得无法响应:
while true;
do ./miner1 <somecodetoconfiguretheminer> &&break;
timeout 900 ./miner2
sleep 15
done;
我已经阅读了几个关于&amp;&amp;&break工作,超时工作以及真实如何工作的主题/问题,但我无法弄清楚我在这里缺少什么。
提前感谢您的帮助!
答案 0 :(得分:0)
更简单的解决方案是始终运行两个程序,并降低不太优先的程序的优先级。在Linux和类似系统上,即:
nice -10 ./miner2loop.sh &
./miner1loop.sh
然后脚本可以与您的第一个脚本类似。
答案 1 :(得分:0)
好的,经过反复试验 - 以及一些帮助 - 我发现我的初始代码没有任何问题。当在终端中使用时,超时在我的linux实例上的行为似乎与在bash脚本中的行为不同。如果在终端中使用它的行为应该是它应该的,它倒计时然后杀死它开始的过程。但是如果在bash中使用 - 它就好像我键入'sleep',然后在倒计时后停止。
显然这与我的Ubuntu实例(在VPS上运行)有关。即使我安装了最新版本的coreutils,也可以通过apt-get update等安装所有最新版本。在Digital Ocean和Google Compute上,我就是这种情况。
解决方案是将超时代码用作bash脚本中的函数,如在stackoverflow中的另一个线程中找到的那样。我将函数timeout2命名为不会混淆系统触发不正常工作的超时命令:
#!/bin/bash
# Executes command with a timeout
# Params:
# $1 timeout in seconds
# $2 command
# Returns 1 if timed out 0 otherwise
timeout2() {
time=$1
# start the command in a subshell to avoid problem with pipes
# (spawn accepts one command)
command="/bin/sh -c "$2""
expect -c "set echo "-noecho"; set timeout $time; spawn -noecho
$command; expect timeout { exit 1 } eof { exit 0 }"
if [ $? = 1 ] ; then
echo "Timeout after ${time} seconds"
fi
}
while true;
do
./miner1 <parameters for miner> && break;
sleep 5
timeout2 300 ./miner2 <parameters for miner>
done;