我正在尝试运行一个简单的循环,当条件为真时,它会向系统发送一些日志。
例子:
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