don-bra.co

さいきんはphpとたわむれてます

sshでログアウトしたあともコマンドを実行し続けたいときのnohupとscreen

長時間かかるコマンドを打ち逃げしたい(sshログイン時)

raspberry piやlinuxサーバなどにsshログインしているときに、この作業時間かかるんだよなーっていうコマンドを打つことありますよね。
丁度いま僕はラズパイにrubyをインストールしようとしていました。結構コンパイルに時間がかかるようで、たぶん1時間くらいかかります。 CPUがあんまり強くないですからね。。

nohup <command> & との出会い

とりあえずインストールだけバックグラウンドで走らせておいて、ホストPC(mac)はログアウトして別のことしたいなあと思っていました。 調べてみると nohup <command> & を使えばうまくいくとのことでした。

試してみたところなぜかログアウトするとプロセスが終了しているようでした。どうしたものか。

困ったときのstack overflowと思い、初めて質問してみました。

stackoverflow.com

するとscreenコマンドつかったらいいよ、とのお声をいただきました。

screenコマンド便利!

screenの使い方についてはこちらの記事がとてもまとまっていました。 まとまりすぎて、僕からは何も付け足せることがないレベルです。。

qiita.com

ほぼ引用になってしまいますが、自分用にも使い方などまとめます。

screenは仮想端末を起動して、その仮想端末上で処理を実行できるコマンドです。 何が便利かというと、ネットワークが不安定な環境だったり、僕のようにLinuxサーバにコマンド打ち逃げしたいときにとっても役立ってくれます。
仮想端末なのでsshからログアウトする or ネットワークが切断されても、アタッチ(=screenで作った仮想端末に接続すること)すれば作業を続行することができます。

screenのインストール

ラズパイには screen がインストールされていないため、 apt-get でインストールする必要があります。

といっても sudo apt-get install screen するだけです。

macだとデフォルトでインストールされているみたいですね。

screenの用語・コマンド・使い方

  • セッション:
    • 仮想端末。screenを打つたびに増える
  • ウインドウ:
    • セッション内での仮想的なウインドウ。1つのセッションに複数作ることができる。
  • アタッチ/デタッチ:
    • セッションに接続/切断すること。切断してもセッションは生きています。

screenコマンドの要点 - Qiita の記事よりほぼ引用です。

はじめに覚えるコマンドはそんなに多くありません!

screen            # => 新しいセッションを作成
screen -ls        # => セッション一覧を表示
screen -r <pid>   # => pidを指定してアタッチ
screen -r         # => 空きセッションが1つならこれでもOK

くらいで大丈夫です。とっても簡単ですね!

セッション・ウインドウの操作は ctrl + aを押してからいくつかのキーで操作できます。

ctrl + a => d    # セッションからデタッチ

ctrl + a => c    # ウインドウの新規作成
ctrl + a => k    # ウインドウを閉じる(ウインドウが一つのときはセッションを削除)
ctrl + a => p, n # ウインドウの移動(前と次へ)

ctrl + a のあとのキーはctrlを押したままでも操作できます。 ctrl + a => ctrl + dでデタッチのような感じです。

もっと詳しくscreenの操作を知りたい方は

qiita.com

の記事を見ることをオススメします!!

nohupについて

nohupで実行したコマンドがラズパイでは死んでしまう理由がわかっていないのがモヤモヤですね。 これに関しては別途調べてみたいと思いますー

今日はscreenっていう便利コマンドを手に入れた感動を書き残しておきました。