如何运行两个命令,但第二个命令有延迟而不停止第一个命令?

时间:2018-04-20 14:47:59

标签: bash monitoring benchmarking sleep

我正在尝试执行以下操作(在使用Raspbian OS的Raspberry Pi 3上):

  1. 启动基准(sysbench
  2. 然后运行一些监控工具(iostatmpstat)经过一段时间的延迟,比如5s,作为预热区间
  3. 所以我制作了以下基本脚本:

    #!/bin/bash
    for x in 16000 32000 64000 128000
    do
      echo "max-prime = $x"
      (sysbench --test=cpu --cpu-max-prime=$x --num-threads=4 run >> results.out) & (sleep 5s && mpstat >> mpstat.out & iostat >> iostat.out)
    done
    

    我尝试了上面第5行的更多变体,但sysbench没有正确执行(我认为是因为sleep?)。用results.out写的输出只是这个,因为循环重复了4次:

    sysbench 0.4.12: multi-threaded system evaluation benchmark
    
    Running the test with following options:
    Number of threads: 4
    
    Doing CPU performance benchmark
    
    Threads started!
    

    如何执行sysbench并在5秒后运行监控工具,而不会影响sysbench

3 个答案:

答案 0 :(得分:2)

如果将命令放在不同的行上,你将会更容易。

for x in 16000 32000 64000 128000
do
  echo "num of threads = $x"
  sysbench --test=cpu --cpu-max-prime=$x --num-threads=4 run >> results.out &
  sleep 5s
  mpstat >> mpstat.out
  iostat >> iostat.out
done

您需要等到基准测试结束才能进入下一个循环。我建议在循环结束时放置waitkill %%来等待或停止它。

答案 1 :(得分:1)

在这里尝试一对额外的括号:

... & (sleep 5s && (mpstat >> mpstat.out & iostat >> iostat.out))
                   ^                                           ^

答案 2 :(得分:0)

您可以将;命令分隔符与&混合以将进程置于后台。

foo & sleep 5; bar &

在您的情况下,您希望循环执行此操作。如果您想在继续循环的下一次迭代之前等待foo完成,请使用wait

for  ... ; do
    foo & sleep 5; bar
    wait
done