我编写了一个简短的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文件字符集会“损坏”?
答案 0 :(得分:0)
/etc/init.d
中的脚本应该启动和停止服务。因此,他们需要准备好接受命令行参数start
和stop
。 (如果他们也接受restart
和status
这样的论点,那就是奖金。)
当您将符号链接放到/etc/rcN.d
目录中的其中一个脚本时,将使用参数start
或stop
调用脚本:
在启动时,参数取决于符号链接的名称是以S
(start
)还是K
(stop
- 开头的字母代表“杀”)。
关闭时,参数将为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文件。