Centos

遠端 SSH 命令掛起,但僅在通過 Jenkins 執行時

  • February 9, 2017

免責聲明:我對社區有點陌生,請溫柔:)

我遇到了一個似乎無法解釋的 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 jenkins@appserver.example.com '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 提示我重新訪問重定向。我想出的是:

ssh -t jenkins@appserver.example.com 'appctl restart all 1>&2'

似乎重定向stdoutstderr使SSH快樂……

引用自:https://serverfault.com/questions/831625