[英]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
中的脚本有望启动和停止服务。 因此,他们需要准备好接受命令行参数start
和stop
。 (如果他们也接受诸如restart
和status
类的参数,那将是一个好处。)
当将符号链接放置到/etc/rcN.d
目录中的这些脚本之一时,该脚本将使用参数start
或stop
调用:
在启动时,参数取决于符号链接的名称以S
( start
)还是K
( stop
字母代表“ 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.