前の記事では、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 | 画面ごと動き続ける | 途中の様子を見たり、操作したりしたい処理 |
ここで紹介する方法は、「ターミナルを閉じても」止めないためのものです。パソコンをシャットダウンしたり、スリープしたりすると、どの方法でも止まります。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
^C1つ目のコマンドのすぐ下の [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:26258 の行が、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
おわりました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デタッチ:部屋を残したまま外に出る
数が流れている状態で、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 回目」のあとに「おわりました」と表示されました。
ターミナルを閉じている間も、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分くらいかかる
【途中で画面を見たいか】例:ときどき進み具合を見たい
【パソコンの電源】例:寝るときは切りたい
【表示されたエラー(あれば)】ここに貼るログファイル(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.shpgrep に出た <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 を使った環境の作り方を見ていきます。
次に読む記事
関連する記事
- Pythonで毎朝のCSV集計を自動化する(pandas+定期実行):時間のかかる処理を自動で動かしたい方に
- n8nとは?最初のワークフローを1本つくる:動かしっぱなしにしたい自動化を、ノーコードで組みたい方に
- 自動化スタック総覧|GAS・n8n・Python・Notionの使い分け:どこで自動化を動かすかを選びたい方に