我正在记录来自的数据top
并将其放入一组循环文件中。我不是top
为一组数据执行然后为下一组重新运行,而是使用读取超时来指定何时从一个日志文件转到下一个日志文件。这样做主要是为了消除每次top
执行时的启动 CPU 负载成本。shell 脚本文件的名称是 toplog.sh,看起来类似于:
#!/data/data/com.spartacusrex.spartacuside/files/system/bin/bash
date
echo " Logging started."
fileCmp()
{
test `ls -lc "$1" | sed -n 's/\([^ ]* *\)\{4\}\([0-9]*\).*$/\2/;p'` $2 $3
}
oldest()
{
ls -rc $1 2> /dev/null |head -1
}
file=`oldest /mnt/sdcard/toplog.\*.gz`
echo " Oldest file is $file"
if [ -z "$file" ]; then
x=0
else
file=${file%%.gz}
file=${file##*.}
x=$file
fi
echo " x=$x"
top -d 20 -b | \
while true; do
file=/mnt/sdcard/toplog.$x.gz
while read -t 5 line; do
echo "$line"
done | gzip -c > $file
if fileCmp "$file" -le 300; then
date
echo " Failure to write to file '$file'."
exit
fi
x=$((($x+1)%10))
sleep 14
done
我使用 nohup 执行此操作,以便当 shell 终止时,此进程仍然运行,如下所示:
$ nohup ./toplog.sh
但是有一个问题。 top
当我退出执行该命令的 shell 会话时终止,我不确定为什么。有任何想法吗?
为了澄清,我正在登录 Android 手机。这些工具的功能有限(即缺少其中一些开关),这就是我使用 top 的原因,因为它包含我想要的输出。
我使用的busybox版本是:
BusyBox 1.19.2 (2011-12-12 12:59:36 GMT)
在我安装终端 IDE 时安装。
顺便说一句,这款手机没有root。当我的手机响应好像 CPU 已经飙升并且不会停机时,我正在尝试追踪故障。
编辑: 好吧,我找到了解决方法。但原因有点模糊。我认为这与流程管理和我正在使用的busybox版本中的错误有关,在回归测试期间被遗漏了。
top
解决方法是用这样的无用循环结构进行包装: while true; do top; done
. 通过测试,top
永远不会被杀死,也不会被重生,但是通过包装它,它不会被杀死。
对此有何见解?