代码之家  ›  专栏  ›  技术社区  ›  CH123

如何运行两个命令,但在不停止第一个命令的情况下延迟第二个命令?

  •  1
  • CH123  · 技术社区  · 6 年前

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

    1. 启动基准测试( sysbench )
    2. 然后运行一些监视工具( iostat mpstat )经过一段时间的延迟,比如说5秒,作为热身间隔

    因此,我制作了以下基本脚本:

    #!/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行的更多变体,但是 系统工作台 执行不当(我想是因为 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!
    

    如何执行 系统工作台 并在5秒后运行监控工具 系统工作台 ?

    3 回复  |  直到 6 年前
        1
  •  2
  •   John Kugelman dbush    6 年前

    如果您将命令放在单独的行上,您将更容易执行。

    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
    

    在进入下一个循环之前,您需要等待基准测试完成。我建议 wait kill %% 在循环结束时等待或停止它。

        2
  •  1
  •   Peter Cordes    6 年前

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

    foo & sleep 5; bar &

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

    for  ... ; do
        foo & sleep 5; bar
        wait
    done
    
        3
  •  1
  •   iBug    6 年前

    请在此处尝试一对额外的括号:

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