为什么nohup仍然导致进程在shell脚本中运行终止?

时间:2013-08-03 20:05:35

标签: android bash busybox nohup

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

对此有何见解?

2 个答案:

答案 0 :(得分:1)

听起来很愚蠢,但是从

更改你的启动命令
nohup ./toplog.sh

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

答案 1 :(得分:0)

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