免责声明:我是一个新的社区,请温柔:)
我有一个SSH问题,我似乎无法解释。 作为一个背景,这里是我正在解决的问题:
环境中存在多个不同的Java服务,需要通过通用接口进行部署。 logging这些服务必须定向到系统日志工具。 通用接口必须通过命令行和Jenkins GUI访问。
我开始看到问题的时候,我添加了redirect到系统日志。 如果我删除了系统日志redirect,一切工作正常。 下面是调用来执行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:channel 0 rtype退出状态回复0
任何想从哪里去这里? 是否有更好的方法来完成系统日志function? 我的pipe道有问题吗?
logging器可能不会分解到后台,所以SSH认为你仍然有一个进程打开,并没有closures连接。
尝试在appctl命令的引号内添加2>/dev/null >/dev/null </dev/null ,以便所有文件句柄在顶层closures。
杰森的回答对我提出的问题是正确的。 但是,我忽略了提到我想在Jenkins控制台中维护appctl输出。
杰森促使我重访redirect。 我想到的是这样的:
ssh -t [email protected] 'appctl restart all 1>&2'
好像将stdoutredirect到stderr似乎使SSH快乐…