免责声明:我对社区有点陌生,请温柔:)
我遇到了一个似乎无法解释的 SSH 问题。作为背景知识,这是我要解决的问题:
环境中存在几个不同的 Java 服务,需要通过公共接口进行部署。这些服务的日志记录必须定向到系统日志工具。公共界面必须可以通过命令行和 Jenkins GUI 访问。
当我将重定向添加到系统日志时,我开始看到问题。如果我删除系统日志重定向,一切正常。下面是一段代码,它被调用来执行 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 功能?我的管道有问题吗?
记录器可能不会分叉到后台,因此 SSH 认为您仍然有一个进程打开并且不会关闭连接。
尝试
2>/dev/null >/dev/null </dev/null
在 appctl 命令的引号内添加,以便在顶层关闭所有文件句柄。杰森的回答对于我提出的问题是正确的。但是,我没有提到我想
appctl
在 Jenkins 控制台中维护输出。Jason 提示我重新访问重定向。我想出的是:
似乎重定向
stdout
到stderr
使SSH快乐......