Centos
遠端 SSH 命令掛起,但僅在通過 Jenkins 執行時
免責聲明:我對社區有點陌生,請溫柔:)
我遇到了一個似乎無法解釋的 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'
似乎重定向
stdout
到stderr
使SSH快樂……