web-dev-qa-db-ja.com

.bashrcに「screen-r」を入れるのは良い考えですか?

Screenを使用して、サーバー上でsshセッションを存続させたいのですが。ログイン時にユーザーの実行中のセッションを自動的に再開できれば便利です。これを行う簡単な方法は、.bashrcに「screen-r」を追加することです。これは問題なく機能するようです。私がまだテストしていない条件下で、これが何かを壊すのではないかと思っています。ここでの経験があり、これが私がすべきことであるかどうかを教えてくれる人はいますか?

17
marcusw

既存のセッションが存在する場合は自動的に接続し、存在しない場合はセッションを作成するには、screen -R -dが必要です。

必ずインタラクティブシェルでのみこれを行ってください。 Bashは、親プロセスがrshdまたはsshdの場合、非対話型シェルの場合でも~/.bashrcをソースします(これはドキュメントに記載されていますが、見逃しがちです)。 $-にはiが含まれているため、シェルがインタラクティブであることがわかります。

case $- in
  *i*) screen -Rd;;
esac

これでは、さまざまな端末でさまざまな画面セッションを簡単に実行できません。

画面から切り離してから、親シェルを終了してログアウトする必要があります。これは、screenの代わりにexec screenを使用することで解決できます。

ログインシェル以外のシェルを起動すると、画面が表示されますが、これはほとんどの場合必要なことではありません。少なくとも、これをインタラクティブなsshセッションで直接実行している場合に制限し、~/.bash_profileに次のようなものを追加します。

case "/$(ps -p $PPID -o comm=)" in
  */sshd) screen -R -d;;
esac

.bashrcで複雑な処理を行う場合は、シェルを終了させるエラーが発生するとログインが困難になるため、注意してください。


私が推奨は、サーバー上のシェル初期化ファイルを変更せず、代わりにクライアントから明示的にscreenを実行することです。

ssh -t Host.example.com screen -R -d

(おそらく、クライアントでシェルエイリアスまたはデスクトップ環境のショートカットを作成します。)こうすることで、screenを実行しないことを簡単に選択したり、代替セッション名を指定したりできます。

Xサーバーの起動スクリプトは、多くの場合、新しいシェルを起動します。 「ユーザー定義セッション」を使用してgdmを使用してログインしている場合。

終了しないものがあると、Xスタートアップがハングする可能性があると思います。これにはscreen -rが含まれます。

2
Mikel