端末クローズ後もプロセス実行を止めない方法(nohup, tmux)

SSHでサーバーに接続して「処理に時間のかかるバッチ」を実行するとき、SSHの接続が切れても実行プロセスを起動させ続ける方法を紹介します。「nohupを利用した方法」と「tmuxを利用した方法」を取り上げます。

動作確認用バッチ

batch.sh というファイルを作成して、以下処理を記述します。

#!/bin/bash

for  i  in  `seq  1  1000`
do
     echo  ${i}
     sleep 1
done

このバッチファイルで動作確認します。

nohup コマンド &

端末が閉じられたとき、端末で起動したプロセスに SIGHUP のシグナル(ハングアップを知らせるシグナル)が送信されます。

プロセスはSIGHUPのシグナルを受信すると、デフォルトで処理を終了します。

nohup経由でコマンドを実行することで SIGHUP を無視するようになります。

バックグラウンドで実行させるため & も最後につけます。

$ nohup ./batch.sh &
[1] 68372
appending output to nohup.out
$ 
$ 
$ cat nohup.out 
1
2
3
4
5
6

実行プロセスの標準出力・標準エラー出力は nohup.out に書き込まれます。

tmux

tmuxをインストール

サーバー(ubuntu)にtmuxをインストールします。

apt-get update
apt install -y tmux

tmuxでプロセスを起動

セッションを開始します。

$ tmux new -s test-session1

tmuxのセッションの中でバッチを実行します。

205-linux-nohup-tmux_01.png

バッチを実行したら、セッションをデタッチします。
デタッチするには、まず Ctrl+b を押します。 次に d を押すとデタッチされます。

再度セッションに接続してみます。まず、現在起動してるセッションを確認します。

$ tmux ls
test-session1: 1 windows (created Fri Jul 27 14:30:25 2018)

セッション名を指定して、再度セッションに接続します。

$ tmux attach -t test-session1

下記のように、バッチの実行が継続しています。

205-linux-nohup-tmux_02.png

tmuxの主な操作

コマンド 説明
tmux セッションを作成
tmux new -s <セッション名> 名前付きでセッションを作成
tmux ls セッション一覧を確認
tmux attach -t <セッション名> 指定セッションにアタッチ
tmux kill-session -t <セッション名> 指定セッションを終了
キー操作 説明
Ctrl+b を押した後に d を押す セッションをデタッチ
Ctrl+b を押した後に ? を押す キーバインド一覧表示

以下、キーバインド一覧表示した時の画面です。

205-linux-nohup-tmux_03.png

参考