linux shell looop循环写法
在 Linux Shell 中编写loop循环的常见方法有以下几种,适用于持续执行任务或监控场景:
1. while true
循环(最常用)
while true; do
# 循环体内的命令
echo "Running..."
sleep 1 # 避免 CPU 占用过高
done
终止方式:按 Ctrl + C
(发送 SIGINT
信号)。
2. for
循环的无限写法
for ((;;)); do
# 循环体内的命令
echo "Infinite loop"
sleep 1
done
3. until false
循环
until false; do
# 循环体内的命令
echo "Looping..."
sleep 1
done
4. 带条件的退出控制
如果需要在满足条件时退出循环,可结合 break
:
while true; do
# 检查某个条件
if [ -f "/tmp/stop" ]; then
echo "Exit loop"
break
fi
echo "Working..."
sleep 1
done
当创建文件 /tmp/stop
时,循环终止:
touch /tmp/stop
5. 后台运行loop循环
将循环放到后台执行(避免阻塞终端):
while true; do
# 后台任务(如监控日志)
tail -f /var/log/syslog
sleep 5
done &
终止后台循环:
-
查找进程 ID:
jobs -l
-
杀进程:
kill %1
(假设作业号为1)
关键注意事项
-
避免 CPU 过载:
在循环体内添加sleep
(如sleep 1
)以降低资源消耗。 -
信号处理:
可捕获SIGINT
(Ctrl+C)或SIGTERM
信号实现优雅退出:trap "echo 'Exiting...'; exit" SIGINT SIGTERM while true; do echo "Running..." sleep 1 done
-
日志记录:
建议将输出重定向到日志文件,避免终端阻塞:while true; do echo "$(date): Task running" >> /var/log/myloop.log sleep 60 done
实际应用场景
-
监控文件变化:
while true; do if [ -f "/tmp/trigger" ]; then echo "Trigger file found!" rm -f /tmp/trigger fi sleep 1 done
-
服务保活:
while true; do if ! pgrep "my_service" > /dev/null; then echo "Restarting my_service..." /path/to/my_service & fi sleep 10 done
根据需求选择合适的方法,并确保循环内有可控的退出机制!