私の目標は、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
スクリーンセッションに-d -m
を使用して、次のようにすることができます。
ssh myuser@hostname screen -d -m "python somepath.py -s 'potato'"
これにより、新しいスクリーンセッションが作成され、その中でコマンドが実行され、自動的に切り離されます。
そのオプションは次のように文書化されています
-d -m
デタッチモードで画面を開始します。これにより新しいセッションが作成されますが、アタッチされません。これは、システム起動スクリプトに役立ちます。
-d -m
オプションは機能しますが、引用符は使用できません。私はする必要があります:
ssh myuser@hostname screen -d -m python somepath.py -s 'potato'
GNUのドキュメントでは要求されておらず、私のシステム(Centos 7)でそれが壊れているため、受け入れられた回答にコマンドの周りに引用符が付いている理由はわかりません。
価値のあること:Jenkinsの下でsshを介して実行すると、画面が生き残っていないことに気づきました。親のssh接続とshスクリプトの実行中は有効ですが、親が閉じると終了するため、画面で問題を解決できない場合があります。
私はこのトリックを使ってみました:
追加
script /dev/null
画面呼び出しの前に、しかしそれは問題を解決しませんでした。魔法のジェンキンがすべてを死に至らしめるために何をしているのかはわかりませんが、効果的です。
次のように追加することで無効にできるjenkinsプロセスキラーによって、事実の後に殺される可能性があります。
export BUILD_ID=dontKillMe
https://serverfault.com/questions/502593/starting-a-forever-process-in-a-jenkins-build-step
私の場合、私はdontKillMeを追加することで、実行時間の長いプロセス(sshトンネル)を維持できる運がありましたが、不要だったため、画面の使用をやめました。