Bash脚本无限循环关闭

时间:2016-01-15 17:00:02

标签: linux bash

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

- 使用gedit打开生成的.txt文件,结果如下: “gedit无法检测字符编码。 请检查您是否尝试打开二进制文件。“ 从菜单中选择一个字符编码,然后重试。“使用Libre Writer打开文件工作正常,文件包含正确的数据。

- 第一次在将脚本放入/etc/init.d/并运行update-rc.d后尝试关闭时,PC需要花费莫名其妙的时间来完成,直到我必须手动关闭。< / p>

这是脚本代码:

#!/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冻结时写入文件,然后是一行#s(可能在手动关闭期间写入)。我想知道导致冻结的原因以及为什么.txt文件字符集会“损坏”?

1 个答案:

答案 0 :(得分:0)

/etc/init.d中的脚本应该启动和停止服务。因此,他们需要准备好接受命令行参数startstop。 (如果他们也接受restartstatus这样的论点,那就是奖金。)

当您将符号链接放到/etc/rcN.d目录中的其中一个脚本时,将使用参数startstop调用脚本:

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

  • 关闭时,参数将为stop

(以上是debian行为,取自Debian policy manual。)

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

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

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

  • 使用stop选项调用时,脚本使用存储在start操作中创建的文件中的PID到kill进程。然后删除pid文件。