获取要终止的 ssh 远程命令,以便具有并行选项的 xarg 可以继续



我正在运行类似于以下内容的命令

getHosts | xargs -I{} -P3 -n1 ssh {} 'startServer; sleep 5; grep -m 1 "server up" <(tail -f log)'

问题是,ssh似乎会挂起一段时间,有时甚至在服务器启动后也会挂起一段时间。此命令是否存在任何问题,可能导致它无法终止以便并行执行可以继续?当我在远程 shell 中运行命令时,对服务器启动的检查似乎是可靠的,并且在将"服务器启动"写入日志时准时关闭。

而不是远程命令

startServer; sleep 5; grep -m 1 "server up" <(tail -f log)

我会用

grep -m 1 "server up" <(tail -F log -n 0) & startServer ; wait

差异:

  • 在尝试重新启动服务器之前开始跟踪日志,这样我们就不会错过任何消息。我们从日志的末尾开始,因此我们看不到任何以前的"服务器启动"消息。
  • 使用 tail-F 选项而不是 -f ,这样如果日志文件被轮换,我们将遵循新文件,而不是继续无用地跟随旧文件。

我可以看到它无法终止的两种方式:

  1. 远程端挂在startServer
  2. 服务器在"server up"之后生成如此多的消息,tail -f没有抓住那一行并永远等待(因为默认情况下,tail将占用最后 10 行)

ssh也可能由于各种原因而无法连接:主机关闭、密钥丢失等。我会以写入日志和/或具有的形式添加一些错误检查条件

|| echo "Failed to do stuff" | mail -s SUBJECT TO@WHO.com

最新更新