免責事項:私はコミュニティに少し新しいです、優しくしてください:)
説明できない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から実行すると、ジョブがハングします。私はジェンキンスで次のコマンドを実行しています:
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はまだプロセスが開いていると見なし、接続を閉じません。
Appctlコマンドの引用符内に2>/dev/null >/dev/null </dev/null
を追加して、すべてのファイルハンドルがトップレベルで閉じられるようにしてください。
ジェイソンの答えは私が尋ねた質問に対して正しいです。ただし、Jenkinsコンソールでappctl
の出力を維持する必要があることについては触れませんでした。
ジェイソンは私にリダイレクトを再訪するように促しました。私が思いついたのはこれです:
ssh -t [email protected] 'appctl restart all 1>&2'
stdout
をstderr
にリダイレクトすると、SSHが快適になるようです...