猫でもわかるWeb開発・プログラミング

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

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

f:id:yoshiki_utakata:20201223070102j:plain

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 ですが、数字の部分だけでもいけます。

[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して実行する時でも安心!