web-dev-qa-db-ja.com

リモートからsshを介してscreenセッションを開始し、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
5
Shelby. S

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

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

これにより、新しいスクリーンセッションが作成され、その中でコマンドが実行され、自動的に切り離されます。

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

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

画面のGNUドキュメントページ

5
Eric Renouf

-d -mオプションは機能しますが、引用符は使用できません。私はする必要があります:

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

GNUのドキュメントでは要求されておらず、私のシステム(Centos 7)でそれが壊れているため、受け入れられた回答にコマンドの周りに引用符が付いている理由はわかりません。

価値のあること:Jenkinsの下でsshを介して実行すると、画面が生き残っていないことに気づきました。親のssh接続とshスクリプトの実行中は有効ですが、親が閉じると終了するため、画面で問題を解決できない場合があります。

私はこのトリックを使ってみました:

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

追加

script /dev/null

画面呼び出しの前に、しかしそれは問題を解決しませんでした。魔法のジェンキンがすべてを死に至らしめるために何をしているのかはわかりませんが、効果的です。

次のように追加することで無効にできるjenkinsプロセスキラーによって、事実の後に殺される可能性があります。

export BUILD_ID=dontKillMe

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

私の場合、私はdontKillMeを追加することで、実行時間の長いプロセス(sshトンネル)を維持できる運がありましたが、不要だったため、画面の使用をやめました。

0
poleguy