美文网首页
终止(kill)一个bash循环

终止(kill)一个bash循环

作者: 田丰w | 来源:发表于2019-11-13 11:53 被阅读0次

场景

在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

不可行的方法:

  1. 直接 ctrl+C, 会给循环里的进程发终止信号, 只能终止循环里正在执行的命令, 例如上例中的 sleep, 而循环又会启动下一个命令.

一个可行的方法:

  1. ctrl+Z 把当前脚本放入后台, 并进入 stoped 状态
  2. jobs 查看放进后台的任务
  3. ps -ef| grep <yourName> | grep <sleep> | grep xxx , 确认找到的是你要终止的进程
  4. ps -ef| grep <yourName> | grep <sleep> | grep xxx | awk '{print $2}' | xargs sudo kill -9 , 终止选中的进程
  5. jobs 查看后台任务是否被 kill

另一个可供尝试的方法:

  1. ctrl+Z 把当前脚本放入后台, 并进入 stoped 状态
  2. jobs 查看放进后台的任务
  3. kill %1 # 或 kill -9 %1 终止后台任务
  4. 会碰到的问题: 这个方法在循环里有 sudo 执行的命令时有权限不足的问题 bash: kill: (13555) - 不允许的操作 ; 使用 sudo kill %1 , 会有找不到%1的问题 kill: failed to parse argument: '%1'

相关文章

网友评论

      本文标题:终止(kill)一个bash循环

      本文链接:https://www.haomeiwen.com/subject/vljhictx.html