gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:27:19 25 4
gpt4 key购买 nike

我正在记录来自 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 session 时终止,我不确定为什么。有什么想法吗?

澄清一下,我正在登录 Android 手机。这些工具的功能有限(即缺少其中一些开关),这就是我使用 top 的原因,因为它包含我想要的输出。

我使用的 busybox 版本是:

BusyBox 1.19.2 (2011-12-12 12:59:36 GMT)

在我安装 Terminal IDE 时安装。

顺便说一句,这部手机没有root。当我的手机响应好像 CPU 已达到峰值并且不会下降时,我正在尝试追踪故障。

编辑:好吧,我找到了解决方法。但是原因有点朦胧。我认为这与流程管理有关,并且我正在使用的 busybox ver 中有一个错误的味道,在回归测试期间被遗漏了。

解决方法是用这样一个无用的循环结构包裹top:while true;做最好的;完成。通过测试,top 永远不会被杀死,也永远不会重生,但通过将其包裹起来,它不会被杀死。

对此有什么见解吗?

最佳答案

听起来很蠢,但是把你的启动命令改成

nohup ./toplog.sh

nohup ./toplog.sh &

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

关于android - 为什么 nohup 仍然导致在 shell 脚本中运行的进程终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18036812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com