远程 SSH 命令挂起,但仅当通过 Jenkins 执行时

远程 SSH 命令挂起,但仅当通过 Jenkins 执行时

免责声明:我对这个社区还比较陌生,请多包涵:)

我遇到了一个似乎无法解释的 SSH 问题。作为背景介绍,以下是我正在解决的问题:

环境中存在多个不同的 Java 服务,需要通过通用接口进行部署。这些服务的日志记录必须定向到 syslog 设施。通用接口必须可通过命令行和 Jenkins GUI 访问。

当我向 syslog 添加重定向时,我开始发现问题。如果我删除 syslog 重定向,一切都会正常工作。以下是执行 Java 进程时调用的一段代码(为方便阅读而删减):

/bin/java myJavaProgram -DvariousFlags=true &> >(logger -p local3.info -t "my prefix") 2>&1 &

这时我有点困惑了——如果我以 Jenkins 用户身份从 Jenkins 所在的服务器运行调用这些脚本的命令,该命令就会起作用。如果我通过 Jenkins GUI 运行它,作业就会挂起。我在 Jenkins 中运行以下命令:

ssh -t [email protected] 'appctl restart all' 2>/dev/null

我已经通过标志确认#!/bin/bash -x脚本即将结束。当我使用运行时ssh -vvv,以下是最后一行输出:

debug1:client_input_channel_req:通道 0 rtype 退出状态回复 0

您对下一步该怎么做有什么想法吗?有没有更好的方法来实现 syslog 功能?我的管道有问题吗?

答案1

记录器可能不会分叉到后台,因此 SSH 认为您仍有打开的进程并且不会关闭连接。

尝试2>/dev/null >/dev/null </dev/null在 appctl 命令的引号中添加内容,以便所有文件句柄都在顶层关闭。

答案2

Jason 的回答对于我提出的问题是正确的。但是,我忘了提到我想appctl在 Jenkins 控制台中维护输出。

Jason 提醒我重新考虑重定向问题。我的想法是这样的:

ssh -t [email protected] 'appctl restart all 1>&2'

似乎重定向到stdout可以stderr让 SSH 高兴……

相关内容