我经常在多个远程服务器上执行需要很长时间的程序:
for NUM in {1..100}; do ssh host-{NUM}.mydomain.com /usr/bin/takesalongtime; done
大多数时候,我让它在后台运行(即在终端模拟器中同时执行其他操作)并等待它完成。但是,有时我需要中断循环并稍后继续或重新运行它。
有没有办法在当前迭代之后停止在交互式 bash 中运行的此类循环,而不杀死进程中的当前ssh
或程序?takesalongtime
即我想做一些事情,以便循环的行为就像我在命令 和break;
之间插入 a 一样,以便它在当前远程主机上完成后中断循环。ssh
done
takesalongtime
答案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 上使用。