Shell脚本:如何循环运行两个程序?

时间:2018-03-07 12:11:40

标签: bash shell loops

我正在运行一个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工作,超时工作以及真实如何工作的主题/问题,但我无法弄清楚我在这里缺少什么。

提前感谢您的帮助!

2 个答案:

答案 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;