我正在记录来自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
但是有一个问题。当我退出执行该命令的shell会话时,top
终止,我不确定为什么。有什么想法吗?
为了澄清,我正在登录Android手机。这些工具功能有限(即缺少一些这些开关),这也是我使用top的原因,因为它包含了我想要的输出。
我正在使用的busybox版本是:
BusyBox 1.19.2 (2011-12-12 12:59:36 GMT)
安装终端IDE时安装。
顺便说一下,这款手机没有根源。当我的手机响应时,我正试图追踪故障,好像CPU已经飙升而且不会熄火。修改 好吧,我找到了一个解决方法。但原因有点模糊。我认为这与流程管理有关,并且我在回归测试期间错过了我正在使用的busybox ver中的错误。
解决方法是将top
包装成无用的循环结构,如下所示:while true; do top; done
。通过测试,top
永远不会被杀死而且永远不会被重生,但是通过包裹它,它不会被杀死。
对此有何见解?
答案 0 :(得分:1)
听起来很愚蠢,但是从
更改你的启动命令nohup ./toplog.sh
到
nohup ./toplog.sh &
&&使其作为后台进程运行,进一步将其从终端堆栈中删除。
答案 1 :(得分:0)
在注销之前在脚本的进程上运行bash internal命令“disown”可能会阻止它被发出信号。