夏☆しちゃってるZE! BOY

夏しちゃってないBOYが気が向いた時に書く日記

SSHしてる時の中断方法一覧

サーバにSSHでつないで作業してる時に,

あ,Write failed: Broken pipe(´・ω・`)

SSH切れた                        (´・ω:;.:...

データなくなった                     (´,';,';,',

さよなら                                    ';,,('

ってならないようにするための幾つかの方法を紹介します

 

最初に今回紹介する3種類の方法を簡単に書きます

①:tmuxやscreenを使ってデタッチ

 (emacsとか人の入力が必要な作業にgood)

②:nohupを使う

 (コンパイルとかプログラムの実行時間計測とかシェルスクリプトとか

  ファイルダウンロートとか人の入力のない作業専用)

③ :disownを使う

  (②をするの忘れてプログラムを動かした時や,
            思ったよりプログラムの実行に時間かかった時,
   急遽席を外さないといけなくなった時など,
   後から②を使う必要が出てきた時用)

 

では順番に見ていきます

①:tmuxやscreenを使ってデタッチ

tmuxはscreenの後に出てきたソフトです.やれることは非常によく似ていて

tmuxのほうが便利なのでtmuxで解説します.

 

: tmuxの導入

パッケージ管理ソフトやらビルドしてコンパイルするなりして入れてください.

 

tmuxの使い方は基本的に

sshでサーバに接続し,tmuxを起動→2.サーバでしたい作業をする→3.tmuxを切ってサーバとの接続を切る(勝手にサーバとの接続が切れても問題ない)」

となります.以下にもう少し詳しく書きます.

 

1 : sshでサーバに接続後にtmuxの起動

$ tmux

と打つことでtmuxを起動します.起動するとターミナルの下部に緑のラインが表示されますが,そこ以外は普通のログインシェルが表示されます.

 

2 : 本来自分がサーバでしたい作業を行う

$ 自分の使いたいコマンド

をtmuxが起動されている状態(ターミナルの下部に緑のラインが表示されている状態)で行います.基本的にはこのまま作業していただいて問題無いです.

 

3 : サーバーとの接続を切れた/切るとき(切れたときは3.1,切るときは3.2)

3.1 : ネットワーク障害でサーバとの接続がいきなり切れた場合→4章へ

3.2 : 手動で接続を切るときは,Ctrlとbを同時押し後,
(プロセスが動いてても,文章を編集中でもいつでも好きなときに押せば良い

dを押すとtmuxの緑バーが画面から消えます.

(このときtmuxおよびプロセスはバックグラウンドで動き続けています)

(キーは初期設定です)

あとは普通に

$ exit

等でサーバとの接続を切りましょう→4章へ

 

4 : サーバとの接続を復帰させる時/サーバで続きから作業するとき

サーバにsshでログイン後

$ tmux a

と書くことで緑バーが表示され3章の前の状態に戻ります やったね!!

 

5 : 以降は基本2,3,4章の繰り返しです.tmuxを切りたい時は,tmux起動中(緑のバー【略】)にexitと打つことでtmuxを終了できます.

 

おまけ:tmuxは画面(ペイン)の分割やタブ(ウィンドウ)のようなものなど,すげー多機能です.自分も主にそっちをメインに使っているので興味があったら他のサイトを参考にしてください.操作はemacsに似ています.tmux複数起動した時の対処法などもそちら参照

 

 

②nohupを使う

nohupを使うとsshの接続(hupの応答なし)が切れてもプログラム実行し続けてね

という命令を出せます.ただし,これだけだと,接続が切れた時に画面の出力がわからなくなる(とおもう)ので,画面の出力をlogファイルに出力させるようにします

 

1 : nohupを使う

$ nohup コマンド名 &

と入力します.nohupで接続切れても実行し続けてという意味があります.

&はバッググラウンドで実行してね.という意味です.

この2つにより,画面に出力されず,本来画面に出力されるはずの文字列は,プログラム実行時のカレントディレクトリにnohup.outとして出力されます.

 

2 : SSHの接続を切る(切れたときは2.1,切るときは2.2)

2.1 : ネットワーク障害でサーバとの接続がいきなり切れた場合→3章へ

2.2 : 1章では,バックグラウンドでコマンドを実行したため,1章で動かしたターミナルにまだコマンドを入力できます.exitで接続を切ってください→3章へ

 

3 : プログラムが終わったかを調べる

プログラムはsshが切れてもバックグラウンドで動き続けています.

プログラムが終了するまで待ちましょう.プログラムが終わったかどうかはsshで接続した後

$ jobs

で前のプロセスが残っているかでわかるはずです(未確認)

 

4 : 結果を見る

結果はnohup.outに書かれているので,これをemacs等でみてください.

 

おまけ : nohupは出力先を変えられます

$ nohup コマンド >出力先 &

でOK

エラーの出力も変える時は

$ nohup コマンド >出力先 >エラー出力先 &

でOK

 

 

③disownをつかう

②の方法は,プログラムの起動時にnohupと&を付ける必要がありました.このとき,nohup &をつけるのを忘れた時に③の方法を使います.これはzshとかbashでないと動かないかも

 

1 : プログラムを実行

$ プログラム

 

1 : プログラムを中断する

Ctrl とzを同時押し

 

2 : 対象jobの確認

$ jobs

で対象プログラムの番号を確認

一人で使っていて,複数ウィンドウたちあげてなければ

大体は1かな?

 

3 : バックグラウンドへ

$ disown %さっきのプログラム番号

例 & disown %1

 

 

このような方法でSSHが切れても(切っても)大丈夫です.

よきSSHライフを!!

';,,('               

(,';,';,    

(`,';,';,',          

(`・ω,';,';,', 

(`・ω・,';,';,',

(`・ω・´) 

 

なんか他にもいい方法あったら教えて下さい