Linux 使用「;这里是“文件”;内循环

Linux 使用「;这里是“文件”;内循环,linux,bash,shell,ssh,nohup,Linux,Bash,Shell,Ssh,Nohup,我需要在here文档中包装一些代码,并使用ssh运行它: for service in ${services[@]} do ssh -tt root@${server} service=${service} 'bash -s' << 'ENDSSH' ps axf | grep "service-${service}" | grep -v grep | awk '{print "kill -9 " $1}' | sh nohup java -jar service-$

我需要在here文档中包装一些代码,并使用ssh运行它:

for service in ${services[@]}
do
ssh -tt root@${server} service=${service} 'bash -s' << 'ENDSSH'
    ps axf | grep "service-${service}" | grep -v grep | awk '{print "kill -9 " $1}' | sh
    nohup java -jar service-${service}.jar >> nohup.out 2>&1 &
ENDSSH
done
${services[@]}中服务的

做
ssh-tt root@${server}service=${service}'bash-s'>nohup.out 2>&1&
ENDSSH
完成

然而,for循环只能执行第一次运行,ssh似乎捕获了stdin,而
for
循环永远挂在那里。如何让ssh立即返回并继续下一步执行?

首先,您可以替换它:

ps axf | grep "service-${service}" | grep -v grep | awk '{print "kill -9 " $1}' | sh
为此:

pkill -f "service-${service}"
您可以跳过“此处文档”并简化:

for service in ${services[@]}
do
{
    echo "pkill -f service-${service}";
    echo "nohup java -jar service-${service}.jar >> nohup.out 2>&1 &";
} | ssh -tt root@${server}
done
或者,如果您更喜欢heredoc:

for service in ${services[@]}
do
ssh -tt root@${server} <<EOF
    pkill -f service-${service}
    nohup java -jar service-${service}.jar >> nohup.out 2>&1 &
EOF
done
${services[@]}中服务的

做
ssh-tt root@${server}nohup.out 2>&1&
EOF
完成

首先,您可以替换此:

ps axf | grep "service-${service}" | grep -v grep | awk '{print "kill -9 " $1}' | sh
为此:

pkill -f "service-${service}"
您可以跳过“此处文档”并简化:

for service in ${services[@]}
do
{
    echo "pkill -f service-${service}";
    echo "nohup java -jar service-${service}.jar >> nohup.out 2>&1 &";
} | ssh -tt root@${server}
done
或者,如果您更喜欢heredoc:

for service in ${services[@]}
do
ssh -tt root@${server} <<EOF
    pkill -f service-${service}
    nohup java -jar service-${service}.jar >> nohup.out 2>&1 &
EOF
done
${services[@]}中服务的

做
ssh-tt root@${server}nohup.out 2>&1&
EOF
完成

当我使用herdeoc版本时,herdeoc中的命令永远不会运行!如果您使用的是非heredoc版本,该怎么办?很抱歉,响应太晚了。今天我尝试了非herdeoc版本,然后for循环只能运行第一个循环,ssh吃stdin。我只需要运行第一个服务!您真的需要ssh的
-tt
选项吗?没有它会发生什么?要解决这个问题,请尝试
-T
。当我使用herdeoc版本时,herdeoc中的命令永远不会运行!如果您使用的是非heredoc版本,该怎么办?很抱歉,响应太晚了。今天我尝试了非herdeoc版本,然后for循环只能运行第一个循环,ssh吃stdin。我只需要运行第一个服务!您真的需要ssh的
-tt
选项吗?没有它会发生什么?要解决该投诉,请尝试
-T
。您引用的是heredoc分隔符,以防止
awk
$1
扩展,但是这也阻止了
$service
的扩展。这里的
$service
是由
ssh
的env变量导出的,并且herdoc delimiter之间的命令工作正常。第一个循环和相应的服务可以终止并启动。这里唯一的问题是
ssh
将吃掉
stdin
,循环将永远挂在那里!您引用heredoc分隔符是为了防止
awk
$1
扩展,但是这也阻止了
$service
的扩展。这里的
$service
是由
ssh
的env变量导出的,并且herdoc delimiter之间的命令工作正常。第一个循环和相应的服务可以终止并启动。这里唯一的问题是
ssh
将吃掉
stdin
,循环将永远挂在那里!