私の目標は、サーバーにリモートで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
分離モードで画面を起動します。これにより、新しいセッションが作成されますが、接続されません。これはシステム起動スクリプトに役立ちます。
答え2
-d -m
このオプションは機能しますが、引用符では機能しないことがわかりました。私はこれをしなければならない:
ssh myuser@hostname screen -d -m python somepath.py -s 'potato'
許可された答えにコマンドの周りに引用符がある理由がわかりません。これはGNUドキュメントでは必要ではなく、私のシステム(Centos 7)ではこれを破ったからです。
言及する価値がある点:JenkinsがSSH経由で実行しているときに画面がアクティブになっていないことを確認しました。親SSHが接続され、shスクリプトが実行されているときにアクティブになりますが、親SSHが閉じると終了するため、画面上で問題を解決できない状況が発生する可能性があります。
私もこのトリックを試してみました。
次へ追加
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トンネル)を実行し続ける幸運を享受しました。しかし、不要なので、もはやスクリーンを使用しません。