【问题标题】:How can I run a shell script every 5 seconds for 2 minutes?如何每 5 秒运行一次 shell 脚本 2 分钟?
【发布时间】:2013-02-04 04:19:55
【问题描述】:

我已经看到了许多解决我一半问题的方法 - 每 5 秒运行一次脚本。

除此之外,我还希望它只运行 2 分钟。

脚本的重点是在一段时间内对某个位置的RSSI进行采样:

#!/bin/bash

RSSI_CSV=$1
DISTANCE=$2
RSSI=$(iwconfig wlan0 | awk -F'[ =]+' '/Signal level/ {print $7}\')

printf "$DISTANCE,$RSSI\n" >> $RSSI_CSV

在命令行调用它:

sh rssi_script.sh output.csv position

解决我的问题的最可靠的解决方案是什么?

我考虑过的可能性:

  • 在自身内部重复脚本 40 次(测量 RSSI 40 次并将其输出到 CSV 40 次,整个实验的位置将相同)这也将解决将运行限制为 2 分钟的问题。我可能会添加一些新的命令行参数,如果我每次都必须更改 40 个变体,这些参数可能很难跟踪
  • 使用 watch 每 5 秒采样一次,使用 cron 将其限制为 2 分钟(不是 100% cron 可以做到这一点)
  • while 循环 2 分钟(不知道如何执行这样的 while 循环?),每个循环结束时休眠 5 秒
  • 使用 cron 启动 shell 脚本作为脚本的 40 个进程并将每次迭代延迟 5 秒,我不确定命令行参数将如何传递,正如我上面所说,我可能会添加一些新的命令行参数所以这可能会导致问题(额外的工作)

如果有任何我遗漏或可以提供帮助的信息,请告诉我,感谢任何人提供的任何帮助。

【问题讨论】:

    标签: shell cron scheduled-tasks


    【解决方案1】:

    受 PeterMmm 输入的启发,我设法让它工作,事实上,运行 N 个样本并在它们之间进行硬编码的休息对我来说效果更好

    #!/bin/bash
    
    RSSI_CSV=$1
    DISTANCE=$2
    N=$3
    
    while [ $N -ne 0 ]
    do
        RSSI=$(iwconfig wlan0 | awk -F'[ =]+' '/Signal level/ {print $7}\')
        printf "$DISTANCE,$RSSI\n" >> $RSSI_CSV
        sleep 2 
        ((N--))
        echo $N
    done
    exit
    

    【讨论】:

      【解决方案2】:
      #!/bin/bash
      
      [ "$3" = "0" ] && { exit; }
      
      RSSI_CSV=$1
      DISTANCE=$2
      RSSI=$(iwconfig wlan0 | awk -F'[ =]+' '/Signal level/ {print $7}\')
      
      printf "$DISTANCE,$RSSI\n" >> $RSSI_CSV
      
      sleep 5
      N=$3
      $0 $1 $2 $((N-1))
      

      像这样运行:

      sh rssi_script.sh output.csv position 24
      

      【讨论】:

      • 至少在最后一行使用exec作为尾递归优化。
      • 使用 exec 是什么意思?新脚本似乎不起作用,我收到错误 rssi_script.sh: 13: rssi_script.sh: rssi_script: not found
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 2010-12-04
      • 2018-10-26
      • 2023-02-19
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多