当前迭代后中断正在运行的 for 循环

当前迭代后中断正在运行的 for 循环

我经常在多个远程服务器上执行需要很长时间的程序:

for NUM in {1..100}; do ssh host-{NUM}.mydomain.com /usr/bin/takesalongtime; done

大多数时候,我让它在后台运行(即在终端模拟器中同时执行其他操作)并等待它完成。但是,有时我需要中断循环并稍后继续或重新运行它。

有没有办法在当前迭代之后停止在交互式 bash 中运行的此类循环,而不杀死进程中的当前ssh或程序?takesalongtime

即我想做一些事情,以便循环的行为就像我在命令 和break;之间插入 a 一样,以便它在当前远程主机上完成后中断循环。sshdonetakesalongtime

答案1

找到 shell 的 pid 并向其发送 sigint。这不会停止 ssh,但当它完成时,shell 将处理信号并结束循环。

$ for i in {1..100}; do ssh -n localhost 'sleep 9;date'; done

在其他终端

$ ps fax
10636 ?        S      0:00          |   \_ xterm
10638 pts/2    Ss     0:00          |       \_ bash
12164 pts/2    S+     0:00          |           \_ ssh -n localhost sleep 9;date
$ kill -int 10638

&如果您通过添加到末尾来将命令置于后台,则可以kill -hup在后台 shell 上使用。

相关内容