有没有办法不用 Ctrl+C 退出 while 循环(bash)

有没有办法不用 Ctrl+C 退出 while 循环(bash)

我正在尝试运行一个简单的循环,当条件为真时,它会向系统发送一些日志。

例子:

while sleep 1800; do
 top -b > /path/to-file.txt
 ping xx.xx.xx.xx > /path/to-file2.txt
 ps -ef > /path/to-file3.txt
done

但看起来即使在睡眠 1800 之后循环仍未退出并继续运行。

有没有办法在半小时后创建退出点?(又名 1800 秒)

答案1

所以我明白了。

从一开始就使用 while 循环并不是最好的主意。我使用了这样的 for 循环,它解决了我的问题:

TOP_LOG=/path/to/top-output.txt
PS_LOG=/path/to/ps-out-put.txt


for ((i = 0; i < $COUNT_TIME; ++i)); do
    top -b -n 1 > $TOP_LOG
    ps -ef > $PS_LOG
    echo "${i}"
    sleep 10
done 

答案2

问题中的代码片段不起作用,因为while实际上运行命令并捕获退出代码。如果退出代码为 0(真),则循环继续,否则中断。

您可以使用$SECONDS变量来获取当前时间(以秒为单位)。

解决方案:

#!/bin/bash
END=$((SECONDS+1800))
while [ $SECONDS -lt $END ]; do
    top -b > /path/to-file.txt
    ping xx.xx.xx.xx > /path/to-file2.txt
    ps -ef > /path/to-file3.txt
done

相关内容