WebエンジニアのLoL日記

LoLをプレイしたりLJLの試合を見たりするのが好きなエンジニア。LoLのイベントやパッチノートなど気になった点を記事にしたり、LJLについの記事をかいたりしています。某社でWeb系のエンジニアとして働いているので、技術系の記事もたまに書きます。コンタクトを取りたい場合はtwitterまで。

sshしてスクリプト回した時にネットワークが切れる心配も不要になる screen コマンドの使い方

ssh接続した先のサーバーで、ちょっと時間がかかるスクリプトrsync とか)を回した場合、実行中にネットワークが切れたりPCが落ちたりして「うわああああああ」ってなる経験をした方がいるかもしれません。そういった時に利用するのが screen コマンドです。screenコマンドを使えばスクリプト実行中にサーバーからログアウトしても実行を続けてくれます。

screen コマンドの流れ

  1. screen コマンドで新しいscreenを作ります
  2. そのscreenの中でスクリプトを実行します
  3. そのscreenから離れます。サーバーからログアウトしてもscreenの中でスクリプトが続きます。
  4. ある程度時間がたってスクリプトが終了することを確認するために、サーバーにsshして先程のscreenを開いてみる。
  5. 終わったらscreenを閉じる

まずはサーバーにsshして、 screen でscreenを作成してみます。

$ ssh target-server
[username@target-server ~]$ screen
[username@target-server ~]$

screen コマンドを打つとなんか画面が切り替わった感じがするはず。これで新しいscreenができました。ここで適当に時間が掛かりそうなスクリプトを実行したりします。

screenから抜けてサーバーからログアウトしてみます。screenから抜けるには Ctrl-a d (Controlキーとaを同時押しした後にControlを離してd) または Ctrl-a Ctrl-d です(Controlキーを押しながらaを押した後、Controlキーを押しながらd)。

[username@target-server ~]$ screen
[detached]
[username@target-server ~]$

[detached] と表示されて元の画面に戻ってきたと思います。これで exit とかしても、さきほどのscreenでスクリプトは実行されつづけます。今動いているscreenを見るには screen -ls です。

[username@target-server ~]$ screen -ls
There are screens on:
    5689.pts-10.target-server(Detached)
1 Sockets in /var/run/screen/S-username

一つのscreenが動いていることがわかります。このscreenに戻るには screen -r <id> です。idは 5689.pts-10.target-server これの 5689 の部分です。

[username@target-server ~]$ screen -r 5689
# さっきの画面に戻る

screenを終了させるいは、この状態で(screenを開いた状態で)exitすればよいです。

[username@target-server ~]$ exit
[screen is terminating]
[yoshiyuki_sakamoto@nv-sysmanage01 ~]$

[screen is terminating] と表示されて元の画面に戻ります。

screenは2つ以上作ることが可能です。

screenにいる時は、 Control + a がscreenコマンドに取られるのでemacsとか使っている人は注意しましょう。

まとめ

screenコマンドを使ってscreen上でスクリプトを実行すれば、時間のかかるスクリプトsshして実行する時でも安心!