何が起こったのか:
入力しましたssh root@ip Nohup Java -jar app.jar &
リモートサーバーでjarを実行します(jarはAPIサーバーです)。
ローカルサーバーがリモートサーバーのNohupに書き込む代わりにjarログを取得しており、jarは実行中ですが機能していません。
期待される結果:
できるSSH EXEC
実行Nohup Java -jar app.jar &
ローカルシステムから。
バージョン:
Ubuntu 18.04
更新:
jarのAPI URLは、jar cmdがPuTTYを介して実行された場合にのみ出力を返します。
リモートssh execの場合、jarのAPI URL出力は404です
更新1:
必要なのは、jarをリモートサーバーのバックグラウンドで実行することだけです(ローカルシステムからcmdを実行します)。
興味深いトピック:)
最初に、リモートコマンドを引用するには、単一引用符を使用する必要があると思いました。この点についての良い説明は、 @ pt314 によって受け入れられた質問の回答内で提供されます SSHはif条件でどのように機能しますか? これは重要でない部分です:
主な問題は、二重引用符で囲まれた文字列がローカルシェルによって展開されることです...
しかし、おそらくこれは問題の一部にすぎません。先に進む前に、インターネットで見つけられる最も一般的な Nohup
's の使用方法について少し説明しましょう。
Nohup comand -options arguments >/path/to/log 2>&1 &
| | | | # run 'Nohup' in the background
| | | # redirect stderror to stdout
| | # redirect stdout of 'Nohup', /dev/null when don't need it
| # the command to be executed, its stdout/err will be appended to the nohop's stdout
# run the following command detached from the current Shell
上記によると、次のようなコマンドが必要なようです:
ssh user@Host 'Nohup remote_command -optins arguments &' >/tmp/local.log
しかし、実際にはここで何が起こりますか?
Nohup
のstdout(標準出力)はsshセッションにアタッチされ、ssh
コマンドの出力は現在のシェルセッション内のファイルにリダイレクトされます。つまり、リモートコマンドはローカルシェルセッションにアタッチされます。したがって、チェーン上の何か(sshセッションまたはローカルシェル)を強制終了すると、すべてが失敗します。どうやら、この場合、リモートセッションにNohup
はまったく必要ありません。
さらに一歩進んだ場合、ローカル側でNohup
を使用することをお勧めします。
Nohup ssh user@Host 'remote_command -optins arguments' >/tmp/local.log 2>&1 &
これは非常に堅牢に見えますが、リモートコマンドの実行はローカルコンピューターから開始されたsshセッションに依存しているため、たとえば再起動すると、すべてが再び失敗します。
あなたがより安全な方法であなたが望むことを達成するための可能な方法はたくさんあると思います。ここに一つの提案があります。
1。Nohup
を正規の方法で使用して、リモートコマンドを実行します。
ssh user@Host 'Nohup remote_command -optins arguments >/tmp/remote.log 2>&1 &'
2。ssh経由でリモートログを取得し、ローカルログをバックグラウンドで書き込みます。
Nohup ssh user@Host 'tail -n+1 -F /tmp/remote.log' >/tmp/local.log 2>&1 &
3。次の方法でローカルログファイルを監視します。
tail -F /tmp/local.log