SSHを介してリモートで画面セッションを開始し、すぐにSSHセッションを閉じます。

SSHを介してリモートで画面セッションを開始し、すぐにSSHセッションを閉じます。

私の目標は、サーバーにリモートでSSHを介して接続し、画面を起動し、スクリプトを起動し、スクリプトを実行し、画面上で私のPythonスクリプトを実行しながらSSHセッションを終了することです。これが私が持っているものです:

ssh -t myuser@hostname screen python somepath.py -s 'potato'

問題は、実行後に手動でCtrl + A + Dを実行し、SSHセッションを直接終了する必要があることです。人の介入なしにこれらすべてを一度に実行する方法はありますか?

編集:-dmを使用して提案されたアプローチを試しました。

見やすくするためにテストしている内容は次のとおりです。

ssh -t user@host screen "top"

リモートで私はこれを見る:

user      2557  0.0  0.2  27192  1468 ?        Ss   13:35   0:00 SCREEN top
user      2562  0.0  0.1  11740   932 pts/0    S+   13:35   0:00 grep --color=auto SCREEN

しかし、これを行うと:

ssh -t user@host screen -dm "top"

私はすぐにホストとの接続を切断しました。私のgrepには何もありません

ps aux | grep SCREEN
user      2614  0.0  0.1  11740   932 pts/0    S+   13:36   0:00 grep --color=auto SCREEN

答え1

-d -mスクリーンセッションを使用して、次のことができます。

ssh myuser@hostname screen -d -m "python somepath.py -s 'potato'"

これにより、コマンドを実行して自動的にそのセッションからユーザーを分離する新しい画面セッションが作成されます。

このオプションは次のように文書化されています。

-d -m
分離モードで画面を起動します。これにより、新しいセッションが作成されますが、接続されません。これはシステム起動スクリプトに役立ちます。

~へScreenのGNUドキュメントページ

答え2

-d -mこのオプションは機能しますが、引用符では機能しないことがわかりました。私はこれをしなければならない:

ssh myuser@hostname screen -d -m python somepath.py -s 'potato'

許可された答えにコマンドの周りに引用符がある理由がわかりません。これはGNUドキュメントでは必要ではなく、私のシステム(Centos 7)ではこれを破ったからです。

言及する価値がある点:JenkinsがSSH経由で実行しているときに画面がアクティブになっていないことを確認しました。親SSHが接続され、shスクリプトが実行されているときにアクティブになりますが、親SSHが閉じると終了するため、画面上で問題を解決できない状況が発生する可能性があります。

私もこのトリックを試してみました。

https://stackoverflow.com/questions/39471261/must-be-connected-to-a-terminal-error-with-screen-x-command-on-a-linux-contai

次へ追加

script /dev/null

スクリーンコールの前に試しましたが、問題は解決しませんでした。 Jenkinsがすべてを死にさせる魔法が何であるかはわかりませんが、うまくいきます。

Jenkinsプロセスキラーによって終了することができ、以下を追加して無効にすることができます。

export BUILD_ID=dontKillMe

https://serverfault.com/questions/502593/starting-a-forever-process-in-a-jenkins-build-step

私の場合は、dontKillMeを追加して長期実行プロセス(sshトンネル)を実行し続ける幸運を享受しました。しかし、不要なので、もはやスクリーンを使用しません。

関連情報