免责声明:我对这个社区还比较陌生,请多包涵:)
我遇到了一个似乎无法解释的 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 高兴……