每2秒更新一次Bash命令(每次都不重新运行代码)

时间:2015-03-27 08:13:50

标签: linux bash

对于我的第一个bash项目,我正在开发一个简单的bash脚本,显示有关我的系统的基本信息:

#!/bash/sh
UPTIME=$(w)  
MHZ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)   
TEMP=$(cat /sys/class/thermal/thermal_zone0/temp)    

#UPTIME shows the uptime of the device   
#MHZ shows the overclocked specs   
#TEMP shows the current CPU Temperature

echo "$UPTIME" #displays uptime
echo "$MHZ" #displays overclocked specs
echo "$TEMP" #displays CPU Temperature

我的问题:我如何对此进行编码,以便uptimeCPU temperature2seconds次刷新一次,而无需每次重新生成新代码(I只是想要更新这两个变量而不必再次输入文件路径并重新运行整个脚本)。

此代码在我的系统上已经正常工作但在命令行执行后,信息不会更新,因为它执行了命令并且等待下一个命令而不是更新变量,例如{ {1}}实时。

我希望有人理解我想要实现的目标,对于我对这个想法的错误措辞感到抱歉。

提前谢谢你......

5 个答案:

答案 0 :(得分:4)

我认为它会对你有所帮助。您可以使用watch命令在没有循环的情况下每两秒更新一次。

watch ./filename.sh

它将每两秒为您提供该命令的更新。

  

观看 - 定期执行程序,显示输出全屏

答案 1 :(得分:2)

不确定是否真正理解主要目标,但这里是对基本问题的回答"我如何对其进行编码以使正常运行时间和CPU温度每两秒刷新一次?" :

#!/bash/sh

while :; do
  UPTIME=$(w)  
  MHZ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)   
  TEMP=$(cat /sys/class/thermal/thermal_zone0/temp)

  #UPTIME shows the uptime of the device   
  #MHZ shows the overclocked specs   
  #TEMP shows the current CPU Temperature

  echo "$UPTIME" #displays uptime
  echo "$MHZ" #displays overclocked specs
  echo "$TEMP" #displays CPU Temperature

  sleep 2
done

答案 2 :(得分:0)

你需要循环的强大力量!这样的事情应该是一个很好的起点:

while true ; do
    echo 'Uptime:'
    w 2>&1 | sed 's/^/   /'

    echo 'Clocking:'
    sed 's/^/   /' /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

    echo 'Temperature:'
    sed 's/^/   /' /sys/class/thermal/thermal_zone0/temp

    echo '=========='
    sleep 2
done

那应该给你三个部分,每个部分的数据都很好地缩进。

答案 3 :(得分:0)

您可以使用while [ : ]sleep 2

答案 4 :(得分:0)

我可能会建议一些修改。

对于这样简单的工作,我建议不要使用外部工具。因此,您可以使用$(cat file)代替$(<file)。这是一种更便宜的方法,因为不需要发射猫。

另一方面,如果阅读这些设备只返回一行,则可以使用内置read的bash:read ENV_VAR <single_line_file。它甚至更便宜。如果有更多行,例如你想阅读第二行,你可以使用这样的sg:{ read line_1; read line2;} <file

正如我所见,w提供了更多信息,因为我认为您只需要标题行。这正是uptime打印的内容。外部实用程序uptime读取/proc/uptime伪文件。因此,为了避免调用外部,您可以直接读取此伪文件。

循环部分也使用外部sleep(1)实用程序。为此,可以使用read内部的超时功能。

简而言之,脚本看起来像这样:

while :; do
  # /proc/uptime has two fields, uptime and idle time
  read UPTIME IDLE </proc/uptime
  # Not having these pseudo files on my system, the whole line is read
  # Maybe some formatting is needed. For MHZ /proc/cpuinfo may be used
  read MHZ </sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
  read TEMP </sys/class/thermal/thermal_zone0/temp

  # Bash supports only integer arithmetic, so chomp off float
  UPTIME_SEC=${UPTIME%.*}
  UPTIME_HOURS=$((UPTIME_SEC/3600))
  echo "Uptime: $UPTIME_HOURS hours"
  echo $MHZ
  echo $TEMP

  # It reads stdin, so pressing an ENTER it returns immediately
  read -t 2
done

这不会调用任何外部实用程序,也不会生成任何fork。因此,不是每2秒执行3个外部实用程序(使用昂贵的forkexecve系统调用),而不执行任何操作。使用的系统资源要少得多。