UNIX コマンドの1つである screen はターミナル内で使えるとても便利なコマンドです。僕も時間のかかるバッチ処理などを行う際に、
(1) まず screen
(2) screen セッションの中でバッチ開始
(3) セッションをデタッチ(Ctrl A + Ctrl D)
とすると、(3) の後にログアウトしてもバックグラウンドでバッチ処理を実行し続けてくれ、再ログイン後に screen -r コマンドを実行することで再度その処理を実行していたセッションに再接続(アタッチ)することができるのです:
そこで処理が終わっていれば結果も確認できるし、まだ終わっていないようであれば、再度デタッチしてログアウトして・・・とても重宝しています。
さて、上記のように明示的にデタッチしてからログアウトする場合はよいのですが、通信状態がよくない場合などに
(1) まず screen
(2) screen セッションの中でバッチ開始
(3) セッションをデタッチする前に通信が切れるなどして強制終了
してしまうことがあります。こうなるとそのセッションは実行中のままにはなりますが、再度ログインしてから再接続することはできなくなってしまうのです:
そんな不可抗力な現象に遭遇した場合、以下の方法で再接続することができます。
まずは現在実行中の screen プロセスを確認します:
↑一番下のプロセスは grep なので関係なし、その上の pts/9 は現在のセッション。一番上の pts/0 のセッションが残ってしまっているためにアタッチできなくなっています。
というわけで pts/0 のセッション(PID が 1111 のもの)を kill します:
これで再度アタッチできるようになります:
(1) まず screen
(2) screen セッションの中でバッチ開始
(3) セッションをデタッチ(Ctrl A + Ctrl D)
とすると、(3) の後にログアウトしてもバックグラウンドでバッチ処理を実行し続けてくれ、再ログイン後に screen -r コマンドを実行することで再度その処理を実行していたセッションに再接続(アタッチ)することができるのです:
$ screen -r
そこで処理が終わっていれば結果も確認できるし、まだ終わっていないようであれば、再度デタッチしてログアウトして・・・とても重宝しています。
さて、上記のように明示的にデタッチしてからログアウトする場合はよいのですが、通信状態がよくない場合などに
(1) まず screen
(2) screen セッションの中でバッチ開始
(3) セッションをデタッチする前に通信が切れるなどして強制終了
してしまうことがあります。こうなるとそのセッションは実行中のままにはなりますが、再度ログインしてから再接続することはできなくなってしまうのです:
$ screen -r
There is a screen on:
nnnn.pts-0.xxxxx (Attached)
There is no screen to be resumed. エラーメッセージが出てアタッチできない
$
そんな不可抗力な現象に遭遇した場合、以下の方法で再接続することができます。
まずは現在実行中の screen プロセスを確認します:
$ ps aux|grep pts|grep sshd kkimura 1111 0.0 0.2 **** **** ? S 18:42 0:00 sshd: kkimura@pts/0 kkimura 2222 0.0 0.2 **** **** ? S 20:47 0:00 sshd: kkimura@pts/9 kkimura 3333 0.0 0.0 **** *** pts/9 S+ 20:49 0:00 grep -r sshd
↑一番下のプロセスは grep なので関係なし、その上の pts/9 は現在のセッション。一番上の pts/0 のセッションが残ってしまっているためにアタッチできなくなっています。
というわけで pts/0 のセッション(PID が 1111 のもの)を kill します:
$ kill 1111
これで再度アタッチできるようになります:
$ screen -r