Linuxでログアウトしても処理を止めない|&・nohup・tmuxの使い方【初心者向け】

前の記事では、ps や kill で、動いているプロセスを見たり止めたりしました。そのとき、コマンドのうしろに & をつけて、裏で動かす方法も少しだけ使いましたね。

よくあるのが、時間のかかるデータ処理を動かして、「終わるまで待てないから」とターミナルを閉じてしまうことです。あとで見てみると、処理は途中で止まっていた…ということがあります。ターミナルを閉じると、そこから動かしたものも一緒に止まってしまうことがあるんです。

この記事では、&・nohup・tmux の3つを使って、「閉じても止めない」動かし方を、練習用のスクリプトで比べていきます。

💡
この記事でわかること
  • & で裏で動かすときの注意点
  • 結果をログファイルに残しながら、裏で動かす書き方
  • tail -f で、ログを見守る方法
  • nohup で、ターミナルを閉じても止まらないようにする方法
  • tmux で、作業画面ごと残しておき、あとで戻ってくる方法
🔰
この記事の前提
  • ps・pgrep・jobs・kill を使える
  • > と 2>&1 で、出力をファイルに保存できる
  • sudo apt install でソフトを入れられる

まだの方は、前の記事「Linuxのプロセス入門|ps・top・killで動いているものを見る・止める【初心者向け】」から読むのがおすすめです。

💡
用語メモ
  • プロセス:今動いているプログラムのこと。1つひとつに番号(PID)がつきます
  • ログ:プログラムが残す「いつ、何が起きたか」の記録
  • ディスク:データをしまっておく部品(SSD など)。電源を切っても消えません

用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。


結論:かんたんに終わるなら nohup、あとで戻りたいなら tmux

方法 書き方 ターミナルを閉じると 向いている場面
& だけ ./count.sh & 止まることがある 閉じる前に終わる短い処理
nohup nohup ./count.sh > count.log 2>&1 & 動き続ける 結果をログで見られればよい処理
tmux tmux new -s work 画面ごと動き続ける 途中の様子を見たり、操作したりしたい処理

3つの方法の違い

💡
パソコンの電源を切ったら、どれも止まります

ここで紹介する方法は、「ターミナルを閉じても」止めないためのものです。パソコンをシャットダウンしたり、スリープしたりすると、どの方法でも止まります。24時間動かし続けたいときは、のちの記事で扱う VPS(レンタルのサーバー)を使う方法があります。また、毎朝決まった時刻に動かしたいときは、cron(=決まった日時に、コマンドをくり返し自動で実行してくれるしくみ)を使います。

WSL を使っている方へ:WSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、Ubuntu などのウィンドウを全部閉じると、しばらくして Linux 側そのものが止まり、nohup や tmux で動かしたものも一緒に止まることがあります(WSL のバージョンや設定など、環境により異なります)。WSL で時間のかかる処理を動かすときは、ウィンドウを1つ開いたままにしておくと安心です。


準備:練習用のスクリプトを作る

練習は ~/linux-practice/nohup-test の中で行います。2秒ごとに数を数えて、1分ほどで終わるスクリプトを作ります。

  • 1
  • 2
  • 3
mkdir -p ~/linux-practice/nohup-test
cd ~/linux-practice/nohup-test
nano count.sh

次の中身を書いて保存します。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
#!/bin/bash
# 2秒ごとに数を数える練習用スクリプト(約1分で終わる)
for i in $(seq 1 30); do
  echo "$i 回目 $(date +%T)"
  sleep 2
done
echo "おわりました"

  • 1
  • 2
chmod u+x count.sh
ls -l count.sh

🖥️
この記事の出力例について

ここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSLでは、表示が少し違うことがあります。

(例)

  • 1
  • 2
  • 3
kaito@demo:~/linux-practice/nohup-test$ chmod u+x count.sh
kaito@demo:~/linux-practice/nohup-test$ ls -l count.sh
-rwxrw-r-- 1 kaito kaito 189 Nov  1 02:57 count.sh

持ち主のところに x がついていれば大丈夫です(グループのところの rw- は、環境の初期設定によって r-- のこともあります)。


& だけで動かすと、どうなるか

まずは前の記事と同じように、& をつけて裏で動かしてみます。

  • 1
./count.sh &

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
kaito@demo:~/linux-practice/nohup-test$ ./count.sh &
[1] 178
kaito@demo:~/linux-practice/nohup-test$ 1 回目 02:57:44
2 回目 02:57:46
3 回目 02:57:48

[1] 178 の 178 が PID(=プロセス1つひとつにつく番号)です(番号は毎回変わります)。プロンプトのすぐうしろに「1 回目 …」が出て、そのあとも2秒ごとに行が流れてきました。

裏で動いているのに、表示が画面にまざって、とても打ちにくくなりました。kill %1 で止めておきましょう(表示がまざっていても、そのまま打って Enter で大丈夫です)。

  • 1
kill %1

結果はログファイルに残す

裏で動かすときは、Lv2 で学んだリダイレクト(=コマンドの結果の行き先を、画面からファイルなどに切りかえること)を使って、表示をファイルに書き出すのが基本です。

  • 1
  • 2
  • 3
./count.sh > count.log 2>&1 &
jobs
tail -f count.log

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
kaito@demo:~/linux-practice/nohup-test$ ./count.sh > count.log 2>&1 &
[2] 186
[1]   Terminated              ./count.sh
kaito@demo:~/linux-practice/nohup-test$ jobs
[2]+  Running                 ./count.sh > count.log 2>&1 &
kaito@demo:~/linux-practice/nohup-test$ tail -f count.log
1 回目 02:57:53
2 回目 02:57:55
3 回目 02:57:57
4 回目 02:57:59
5 回目 02:58:01
^C

1つ目のコマンドのすぐ下の [1] Terminated ./count.sh は、さっき kill %1 で止めた count.sh が終わったという知らせです。次のコマンドを打ったときに表示されました。

tail -f は、ファイルに書き足された行を、その場で表示し続けます。数行ながめたら Ctrl + C を押して、tail を終わります。tail を止めても、裏の count.sh は動き続けています。

  • 1
jobs

(例)

  • 1
  • 2
kaito@demo:~/linux-practice/nohup-test$ jobs
[2]+  Running                 ./count.sh > count.log 2>&1 &

ターミナルを閉じてみる

この状態で、ターミナルのウィンドウを閉じて、新しく開き直してください。そして、count.sh がまだ動いているか確かめます。

  • 1
  • 2
  • 3
cd ~/linux-practice/nohup-test
pgrep -af count.sh
tail -3 count.log

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
kaito@demo:~$ cd ~/linux-practice/nohup-test
kaito@demo:~/linux-practice/nohup-test$ pgrep -af count.sh
186 /bin/bash ./count.sh
kaito@demo:~/linux-practice/nohup-test$ tail -3 count.log
7 回目 02:58:05
8 回目 02:58:07
9 回目 02:58:09

ターミナルを閉じると「終わりの合図」(HUP という合図)が送られて、& で動かしたものも一緒に止まるのがふつうです。多くの環境では端末を閉じると止まります(環境によっては止まらないこともあります)。pgrep に何も表示されず、ログの最後が途中の回数で止まっていたら、止まった証拠です。

今回の Debian 13 の検証では、上のように pgrep に count.sh の行が表示され、ログの回数も進んでいて、止まっていませんでした。検証用の環境のしくみの都合で、閉じる合図が count.sh まで届かなかったためです。このように止まっていなかったときは、pgrep -af count.sh で PID を確かめて kill PID で止めるか、1分ほど待って「おわりました」になってから、次へ進みましょう(検証では、終わるまで待ちました)。


nohup:閉じる合図を聞かないで動かす

nohup は「no hang up(切らないで)」の略で、ターミナルを閉じたときの合図を聞かないようにして動かします。

  • 1
  • 2
  • 3
cd ~/linux-practice/nohup-test
nohup ./count.sh > count.log 2>&1 &
jobs

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/nohup-test$ nohup ./count.sh > count.log 2>&1 &
[1] 258
kaito@demo:~/linux-practice/nohup-test$ jobs
[1]+  Running                 nohup ./count.sh > count.log 2>&1 &

画面には、[1] 258 だけが表示されました。nohup の知らせ(日本語の環境では nohup: 入力を無視します)は、2>&1 によって画面ではなく count.log のほうに書き込まれます。

もう一度、ターミナルのウィンドウを閉じて、新しく開き直します。

  • 1
  • 2
  • 3
cd ~/linux-practice/nohup-test
pgrep -af count.sh
tail -3 count.log

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
kaito@demo:~$ cd ~/linux-practice/nohup-test
kaito@demo:~/linux-practice/nohup-test$ pgrep -af count.sh
186 [count.sh] <defunct>
258 /bin/bash ./count.sh
kaito@demo:~/linux-practice/nohup-test$ tail -3 count.log
3 回目 02:59:22
4 回目 02:59:24
5 回目 02:59:26

258 の行が、nohup で動かしている count.sh です。186 [count.sh] <defunct> の行は、さっき終わった1つ目の count.sh の記録で、検証用の環境だけに残るものです(ふだんの環境では表示されません)。

今度は、ターミナルを閉じても動き続けています。1分ほどたってから tail -3 count.log をもう一度打つと、最後に「おわりました」と表示されるはずです。

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/nohup-test$ tail -3 count.log
29 回目 03:00:14
30 回目 03:00:16
おわりました

💡
> count.log を書き忘れると nohup.out ができる

nohup ./count.sh & のように出力先を書かないと、nohup.out というファイルが自動で作られ、そこに表示が書き込まれます。どこに書いたかわからなくならないように、出力先は自分で決めておくのがおすすめです。途中で止めたいときは、前の記事と同じように pgrep -af count.sh で PID を確かめてから kill PID で止めます。


tmux:作業画面ごと残しておく

nohup は「動かしっぱなし」にはできますが、途中で画面を見たり、キーを押したりはできません。そこで便利なのが tmux です。tmux は、ターミナルの中に消えない作業部屋(セッション)を作る道具です。

tmux を入れる
  • 1
  • 2
  • 3
sudo apt update
sudo apt install tmux
tmux -V

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
kaito@demo:~/linux-practice/nohup-test$ sudo apt update
[sudo] password for kaito:
Get:1 http://deb.debian.org/debian trixie InRelease [140 kB]
Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB]
Fetched 231 kB in 0s (4136 kB/s)
All packages are up to date.
kaito@demo:~/linux-practice/nohup-test$ sudo apt install tmux
Installing:
  tmux

Installing dependencies:
  libevent-core-2.1-7t64  libjemalloc2

Summary:
  Upgrading: 0, Installing: 3, Removing: 0, Not Upgrading: 0
  Download size: 897 kB
  Space needed: 2448 kB / 109 GB available

Continue? [Y/n] Y
…(途中省略)…
Setting up tmux (3.5a-3) ...
Processing triggers for man-db (2.13.1-1) ...
Processing triggers for debianutils (5.23.2) ...
Processing triggers for libc-bin (2.41-12+deb13u4) ...
kaito@demo:~/linux-practice/nohup-test$ tmux -V
tmux 3.5a

[sudo] password for kaito: では、自分のパスワードを打って Enter を押します(打った文字は画面に出ません)。Continue? [Y/n] には Y と答えます。

セッションを作って、中でスクリプトを動かす

work という名前のセッションを作ります。

  • 1
tmux new -s work

画面のいちばん下に、緑色の帯(ステータスバー)が出たら、tmux の中に入っています。この中で、スクリプトを動かしてみましょう。

  • 1
  • 2
cd ~/linux-practice/nohup-test
./count.sh

Debian 13での実行画面

デタッチ:部屋を残したまま外に出る

数が流れている状態で、Ctrl + b を押して指をはなし、そのあと d を押します。これをデタッチ(切りはなす)と言います。

(例)

  • 1
[detached (from session work)]

元のターミナルに戻りました。セッションの一覧を見てみます。

  • 1
tmux ls

(例)

  • 1
  • 2
kaito@demo:~/linux-practice/nohup-test$ tmux ls
work: 1 windows (created Sun Nov  1 03:00:39 2026)

ターミナルを閉じて、あとで戻ってくる

ここでターミナルのウィンドウを閉じて、新しく開き直します。そして、さっきの部屋に戻ります。これをアタッチと言います。

  • 1
tmux attach -t work

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
kaito@demo:~$ tmux attach -t work
kaito@demo:~/linux-practice/nohup-test$ cd ~/linux-practice/nohup-test
kaito@demo:~/linux-practice/nohup-test$ ./count.sh
1 回目 03:00:44
2 回目 03:00:46
3 回目 03:00:48
4 回目 03:00:50
5 回目 03:00:52
6 回目 03:00:54
7 回目 03:00:56
8 回目 03:00:58
9 回目 03:01:00
10 回目 03:01:02
[work] 0:bash*                                                                "demo" 03:01 01-Nov-26

戻った直後の画面です。そのまま待つと、「30 回目」のあとに「おわりました」と表示されました。

Debian 13での実行画面

ターミナルを閉じている間も、tmux の部屋の中ではスクリプトが動き続けていました。

セッションを終わる

用事が終わったら、tmux の中で exit と打つと、セッションが終わります。

  • 1
  • 2
exit
tmux ls

(例)

  • 1
  • 2
  • 3
[exited]
kaito@demo:~$ tmux ls
no server running on /tmp/tmux-1000/default

tmux の操作 キー・コマンド
名前つきで作る tmux new -s 名前
部屋を残して外に出る(デタッチ) Ctrl + b → d
一覧を見る tmux ls
戻る(アタッチ) tmux attach -t 名前
終わる 中で exit

🚫
止め方のわからない処理を、動かしっぱなしにしない(文章だけで説明します)

nohup や tmux で動かしたものは、ターミナルを閉じても動き続けます。終わりのないくり返しや、たくさんのファイルを書き込む処理を動かしっぱなしにすると、ディスクがいっぱいになったり、パソコンがずっと重くなったりします。また、tmux kill-server はすべてのセッションをまとめて終わらせるので、ほかの作業も止まってしまいます。会社や学校の共用サーバーで、ほかの人の処理に影響が出ることもあります。この記事では試しません。動かす前に「どうやって止めるか」(pgrep と kill、または tmux attach して Ctrl + C)を確かめておきましょう。

🤖 詰まったらAIに聞こう:どの方法で動かせばいいかわからない

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
Linuxの初心者です。時間のかかる処理を、ターミナルを閉じても止まらないように動かしたいです。
&・nohup・tmux のどれを使うのがよいか、理由とあわせて教えてください。
止め方と、結果の確かめ方もセットで教えてください。

【使っている環境】WSLのUbuntu など
【動かしたいもの】例:Python のスクリプトで、30分くらいかかる
【途中で画面を見たいか】例:ときどき進み具合を見たい
【パソコンの電源】例:寝るときは切りたい
【表示されたエラー(あれば)】ここに貼る

🔒
AIに貼る前に:秘密情報やパスワードは貼らない

ログファイル(count.log や nohup.out)には、プログラムが表示したものがすべて残ります。APIキー、トークン、パスワード、お客さまの情報などが表示されていることもあるので、AI に貼る前に中身を見て「***」に置き換えてください。APIキーやトークンは、Web のサービスを使うときに本人の代わりになる、合言葉のような文字列です。


後片づけ

練習のスクリプトが残っていないか確かめます。

  • 1
  • 2
  • 3
pgrep -af count.sh
tmux ls
ls ~/linux-practice/nohup-test

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
kaito@demo:~$ pgrep -af count.sh
186 [count.sh] <defunct>
258 [count.sh] <defunct>
kaito@demo:~$ tmux ls
no server running on /tmp/tmux-1000/default
kaito@demo:~$ ls ~/linux-practice/nohup-test
count.log  count.sh

pgrep に出た <defunct> の2行は、もう終わった count.sh の記録で、検証用の環境だけに残るものです。ふだんの環境では、何も表示されません。

tmux はこのあとも便利に使えるので、入れたままで大丈夫です。


よくある質問

Q. tmux attach を名前なしで打つと、どうなりますか?

名前を書かないと、いちばん最近使ったセッションに戻ります。セッションが1つだけなら、tmux attach で十分です。いくつか作ったときは、tmux ls で名前を確かめてから tmux attach -t 名前 で選びましょう。

Q. tmux の中で tmux と打ったら、エラーが出ました。

sessions should be nested with care のような表示は、「もう tmux の中にいますよ」という知らせです。tmux の中で、さらに tmux を開く必要はありません。今どちらにいるかわからなくなったら、画面のいちばん下に緑色の帯(ステータスバー)があるかどうかで見分けられます。帯があれば tmux の中です。

Q. tmux の中で、流れて消えた表示をさかのぼって見るには?

Ctrl + b を押してから [ を押すと、さかのぼって見るモードになり、矢印キーや PageUp で上に戻れます。q を押すと元に戻ります。マウスのホイールでは、初期設定のままだとうまくさかのぼれないことがあります。


まとめ

  • & だけで裏で動かすと、表示がまざり、ターミナルを閉じると止まることがある
  • 裏で動かすときは > ファイル 2>&1 でログに残し、tail -f で見守る
  • nohup … & なら、ターミナルを閉じても動き続ける
  • tmux なら、作業画面ごと残しておき、tmux attach で戻ってこられる
  • デタッチは Ctrl + b → d、終わるときは中で exit
  • 電源を切ればどれも止まる。動かす前に止め方を確かめておく

次の記事では、Linux で Python を動かすための準備として、apt・venv・pip を使った環境の作り方を見ていきます。


次に読む記事


関連する記事