场景
在bash交互界面执行了一个循环,例如,当它出现问题(例如长时间执行不完)时, 需要终止这个循环.
st=20170101
et=20191111
temp="${st}"
while [[ "${temp}" -le "${et}" ]];do
tmpdate="$(date -d "$temp" +'%Y%m%d')"
echo "${tmpdate}"
sudo sleep 100
temp=`date -d "$temp 1 day" +"%Y%m%d"`
done
不可行的方法:
- 直接 ctrl+C, 会给循环里的进程发终止信号, 只能终止循环里正在执行的命令, 例如上例中的 sleep, 而循环又会启动下一个命令.
一个可行的方法:
- ctrl+Z 把当前脚本放入后台, 并进入 stoped 状态
- jobs 查看放进后台的任务
- ps -ef| grep <yourName> | grep <sleep> | grep xxx , 确认找到的是你要终止的进程
- ps -ef| grep <yourName> | grep <sleep> | grep xxx | awk '{print $2}' | xargs sudo kill -9 , 终止选中的进程
- jobs 查看后台任务是否被 kill
另一个可供尝试的方法:
- ctrl+Z 把当前脚本放入后台, 并进入 stoped 状态
- jobs 查看放进后台的任务
- kill %1 # 或 kill -9 %1 终止后台任务
- 会碰到的问题: 这个方法在循环里有 sudo 执行的命令时有权限不足的问题
bash: kill: (13555) - 不允许的操作
; 使用 sudo kill %1 , 会有找不到%1的问题kill: failed to parse argument: '%1'
网友评论