我需要通过 ssh 连接到服务器并检查服务以查看它是否已启动并正在运行。我所做的是使用 ssh 并运行一个调用该服务的命令并检查该命令的输出。我想要一个进度条来向用户显示脚本正在尝试检查服务的状态;但是当服务器没有返回 ssh 命令时,我无法运行进度条功能!(ssh 必须等待服务完全启动才能检查状态)并且我错过了那部分进度。
有没有标准的方法来处理这种情况?
我的 ssh 命令是这样的:
State=$(ssh host "app-status")
Run Code Online (Sandbox Code Playgroud)
它应该返回如下内容:
Status OK
Run Code Online (Sandbox Code Playgroud)
您可以ssh在后台运行并将其输出写入 FIFO
#! /bin/bash
mkfifo fifo-ssh
(ssh host "app-status"; echo error;) >fifo-ssh &
exec 3<>fifo-ssh
until read -t 1 -u 3 status; do
echo -n .
done
# if [ "$status" = error ]; then...
Run Code Online (Sandbox Code Playgroud)
替代 Hauke 的不涉及创建命名管道(以及与独占访问相关的麻烦,清理......),保留退出状态,并支持多行输出:
result=$(
{
{
ssh host app-status >&3 3>&-; echo "$?"
} | {
until read -t1 ret; do
printf . >&2
done
exit "$ret"
}
} 3>&1
)
Run Code Online (Sandbox Code Playgroud)
应该在zsh,ksh93和bash($status是特殊的 ( 的别名$?) in zshlike in (t)csh) 中工作。
上面,我们有一个子外壳 ( { ssh ...; echo "$?"; }),它的输出进入until循环。除了返回$?时,该子shell 没有输出任何内容ssh。ssh输出本身$result通过文件描述符 3 到达,我们已将其指向提供命令替换的管道。
因此,在ssh运行时,read -t1将超时,一旦ssh返回,read将读取退出状态并完成循环。