繁体   English   中英

Bash脚本无限循环关闭

[英]Bash script infinite loop shutdown

我编写了一个简短的bash脚本,该脚本每10秒收集一次CPU温度,并将其与其他一些数据一起输出到文件中。 在终端中运行脚本非常正常。 但是,一旦将脚本设置为在启动时运行,就会遇到2个问题:

-使用gedit打开生成的.txt文件会导致:“ gedit无法检测到字符编码。请检查您是否未尝试打开二进制文件。” 从菜单中选择一个字符编码,然后重试。”使用Libre Writer打开文件可以正常工作,并且文件中的数据正确。

-第一次将脚本放在/etc/init.d/中并运行update-rc.d后,我尝试关闭PC时,莫名其妙地花费了很长时间,以至于我不得不手动关闭。

这是脚本代码:

#!/bin/bash

readonly DIR_PATH='/home/ivan/Documents/temp_data/' # path to output dir, change to yours, don't use HOME variable

while true; do
    temps_str=$(sensors | grep "Physical" | tr -dc "[:digit:][^ °.C]") #  extract numbers from sensors command output
    temps_str=${temps_str:5} # remove first 5 characters, they are ' ', ' ', '0', ' ', ' ' and useless
    temps_array=($temps_str) # convert string to array

    temp_now=${temps_array[0]} # CPU temp now
    temp_high=${temps_array[1]} # highest CPU temp recorded in this session
    temp_max=${temps_array[2]} # CPU temp at which PC turns off

    dt=$(date +%d-%m-%Y) # date, format: dd-mm-yyyy
    time=$(date +%H:%M:%S) # time, format: HH:MM:SS

    # create output directory if it doesn't already exist
    if [ ! -d $DIR_PATH ]; then
        mkdir -m 755 $DIR_PATH
    fi

    echo $time $temp_now $temp_high $temp_max >> ${DIR_PATH}${dt}.txt # write to output file

    sleep 10 # wait 10 seconds
done

这是输出文件的格式:

17:22:21 58.0°C 87.0°C 105.0°C

17:22:31 56.0°C 87.0°C 105.0°C

17:22:41 58.0°C 87.0°C 105.0°C

17:22:51 59.0°C 87.0°C 105.0°C

17:23:01 58.0°C 87.0°C 105.0°C

17:23:11 59.0°C 87.0°C 105.0°C

17:23:21 60.0°C 87.0°C 105.0°C

17:23:32 63.0°C 87.0°C 105.0°C

17:23:42 63.0°C 87.0°C 105.0°C

当我得到“永久关闭”时,我手动将其关闭。 重新启动后,该文件显示脚本仍在运行,并且在PC冻结时正在写入文件,然后显示#号行(可能在手动关闭期间写入)。 我想知道是什么原因导致冻结,为什么.txt文件字符集被“损坏”?

/etc/init.d中的脚本有望启动和停止服务。 因此,他们需要准备好接受命令行参数startstop (如果他们也接受诸如restartstatus类的参数,那将是一个好处。)

当将符号链接放置到/etc/rcN.d目录中的这些脚本之一时,该脚本将使用参数startstop调用:

  • 在启动时,参数取决于符号链接的名称以Sstart )还是Kstop字母代表“ kill”)开头。

  • 关机时,参数将为stop

(以上是Debian的行为,摘自Debian政策手册 。)

您的脚本不是这种形式。 它只是运行监视程序。 因此,当使用参数stop调用它时,它不会停止监视。 它将启动另一个监视循环,该循环永远不会终止 因为它是直接从关闭序列中调用的,所以可以防止关闭终止。

编写init.d脚本的常用方法基于以下内容:

  • 当使用start选项调用该脚本时,该脚本将其作为守护进程启动服务(即您当前的监视脚本),并将其PID写入名称与服务名称相关的文件中。 (放置此文件的常见位置是/var/run目录,通常带有扩展名.pid 。)有一些标准实用程序可以将进程作为守护程序启动,可以帮助完成此任务。 如果您具有基于Debian的安装(包括Ubuntu),请查看shell实用程序库/lib/lsb/init-functions

  • 当被叫stop选项,该脚本使用存储在创建的文件中的PID start行动, kill进程。 然后删除pid文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM