1

我正在记录来自的数据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永远不会被杀死,也不会被重生,但是通过包装它,它不会被杀死。

对此有何见解?

4

2 回答 2

1

听起来很愚蠢,但是将您的启动命令从

nohup ./toplog.sh

nohup ./toplog.sh &

& 使其作为后台进程运行,进一步将其从终端堆栈中删除。

于 2013-08-03T21:09:52.667 回答
0

在注销之前在脚本进程上运行 bash 内部命令“disown”可能会阻止它发出信号。

于 2013-08-03T21:13:10.467 回答