如何在不终止当前运行进程的前提下终止后台循环?
解决方案
方法一:使用标记文件停止循环
这种方法简单直观,通过检查临时文件的存在来决定是否终止下一轮循环:
修改你的后台循环脚本如下:
while read pref; do # 检查是否存在停止标记文件,若存在则退出循环 [ -f /tmp/stop_my_loop ] && break sh myscript.sh "$pref" done < "$mani" &
操作步骤:
- 当你想停止进入下一轮循环时,创建标记文件:
touch /tmp/stop_my_loop - 当前正在运行的
myscript.sh会继续执行直到完成,之后循环会检测到标记文件并退出。 - 循环退出后,可以删除标记文件以便后续复用:
rm /tmp/stop_my_loop
方法二:使用信号触发停止
这种方法通过发送自定义信号给循环进程,无需创建临时文件:
修改脚本为:
# 初始化停止标志 stop_flag=0 # 捕获SIGUSR1信号,将停止标志设为1 trap 'stop_flag=1' SIGUSR1 while read pref; do [ $stop_flag -eq 1 ] && break sh myscript.sh "$pref" done < "$mani" &
操作步骤:
- 首先找到后台循环的进程ID(PID):
也可以用pgrep -f "while read pref"ps aux | grep "while read pref"来确认进程信息。 - 发送SIGUSR1信号给该PID:
kill -USR1 <循环进程PID> - 当前的
myscript.sh会继续执行完成,之后循环检测到标志位为1,退出循环。
注意事项:
- 两种方法都不会终止正在运行的
myscript.sh进程,只会阻止循环启动下一次执行。 - 使用
done < "$mani"代替cat $mani | while ...可以避免子shell问题,让信号捕获更可靠。
内容的提问来源于stack exchange,提问作者gabby
相关产品推荐
相关产品推荐

