nohup コマンド:使い方と nohup.out、ターミナルを閉じても実行を続ける方法

テスト環境RHEL系AlmaLinux 9.8coreutils 8.32rootアカウントDebian 12 · coreutils 9.1 一般ユーザー2026-11-05 確認
ターミナルを閉じても実行を続ける

ターミナルを閉じたり SSH 接続が切れたりしても作業を続けさせるには、nohup コマンドで実行します。nohup は、ターミナルが閉じるときに届く切断シグナル(SIGHUP)を無視させた状態でコマンドを実行します。AlmaLinux 9 サーバーで nohup を付けた sleep と付けない sleep を一緒に起動してターミナルを閉じたところ、nohup で起動したほうだけが残って実行を続けました。

以下の出力は AlmaLinux 9.8 サーバー(root アカウント)と Debian 12 サーバー(一般アカウント)で実行した結果です。長時間動く作業の代わりに sleep を起動し、終了するときは起動時に受け取った PID だけを指定しました。時刻は UTC で出力しています。

1️⃣ nohup コマンドの使い方

  • ↪️ コマンド末尾の & とターミナルを閉じたとき

nohup は実行するコマンドの前に付け、コマンド末尾の & で バックグラウンド実行を指定します。GNU 公式マニュアルによると、nohup 自体はコマンドをバックグラウンドに送らないため、& を外すとコマンドが終わるまでプロンプトが戻りません。

nohup sleep 300 &
[1] 3431609
nohup: ignoring input and appending output to 'nohup.out'

[1] はジョブ番号、3431609 は起動したプロセスの PID です。続いて出たメッセージは、キーボード入力を受け取らず、出力は nohup.out ファイルに追記するという案内でした。

直前に起動したジョブの PID は $! に残るので、起動した直後に [echo $!] で確認して控えておけば、状態を見るときも終了するときもその番号をそのまま使えます。

echo $!
3431609

ターミナルを閉じるとシェルが切断シグナルを受け取り、そのシェルから起動したジョブにも同じシグナルを送ります(Bash 公式マニュアルによる)。この動作を確かめるため、新しいターミナルで [nohup sleep 300 &] と、nohup なしの [sleep 301 &] を一緒に起動しました。

sleep 301 &
[2] 3432892
jobs -l
[1]- 3432883 Running                 nohup sleep 300 &
[2]+ 3432892 Running                 sleep 301 &

2つのジョブが Running の状態でターミナルのウィンドウを閉じ、別のシェルから2つの PID を ps で確認しました。

ps -p 3432883,3432892 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3432883 S          00:05 sleep 300

nohup で起動した sleep 300 だけが残り、nohup なしで起動した sleep 301 はターミナルを閉じるときに一緒に終了しました。

nohup で起動したプロセスは、おやすみモードをオンにしたスマートフォンのようなものです。

nohup は coreutils パッケージに含まれるコマンドです。インストールされているバージョンは --version の1行目で確認します。AlmaLinux 9.8 サーバーは 8.32、Debian 12 サーバーは 9.1 でした。

nohup --version | head -1
nohup (GNU coreutils) 8.32
nohup --version | head -1
nohup (GNU coreutils) 9.1

2️⃣ nohup.out と出力リダイレクト

  • ↪️ ログファイルの指定と /dev/null

出力先を指定しないと、nohup はコマンドの出力を現在のフォルダーの nohup.out に追記します。最初に作られた nohup.out はサイズが 0 で、パーミッションは作成したユーザーだけが読み書きできる -rw------- でした。

ls -l nohup.out
-rw------- 1 root root 0 Oct 28 23:04 nohup.out

GNU 公式マニュアルは、umask の設定に関係なく nohup.out を作成したユーザーだけが読み書きできるように作ると説明しています。現在のフォルダーに書き込めない場合はホームフォルダーの $HOME/nohup.out に書き込み、そこにも書き込めない場合はコマンドを実行しません。

出力のあるコマンドを nohup で実行すると、コマンドが終わったあとも出力が nohup.out に残りました。

nohup sh -c 'echo start; sleep 2; echo end' &
[1] 3431985
nohup: ignoring input and appending output to 'nohup.out'
cat nohup.out
start
end
[1]+  Done                    nohup sh -c 'echo start; sleep 2; echo end'

最後の行の Done は、ジョブが終わったことを知らせるシェルの通知です。nohup.out は実行するたびに新しく作られるのではなく同じファイルの末尾に追記されるため、同じフォルダーで複数のジョブを起動すると出力が1つのファイルに混ざります。

ジョブごとにログを分けるには、> で出力ファイルを指定し、2>&1 でエラー出力も同じファイルに送ります。

nohup sh -c 'echo start; sleep 300' > job.log 2>&1 &
[1] 3432059
cat job.log
nohup: ignoring input
start

2>&1 まで付けると、ターミナルにはジョブ番号と PID だけが表示され、nohup の案内メッセージ [nohup: ignoring input] はログファイルの1行目に記録されました。

> だけを付けて 2>&1 を外すと、エラー出力を標準出力側のファイルに回すという案内がターミナルに表示されます。

nohup sleep 300 > job2.log &
[2] 3432097
nohup: ignoring input and redirecting stderr to stdout

出力を残す必要のないジョブは /dev/null に送ります。この場合もターミナルにはジョブ番号と PID だけが表示されました。

nohup sleep 300 > /dev/null 2>&1 &
[3] 3432137

4つの実行形式で、出力が行った先とターミナルに表示されたメッセージは次のとおりです。

実行形式出力先ターミナルに表示されたメッセージ
nohup コマンド &現在のフォルダーの nohup.outnohup: ignoring input and appending output to 'nohup.out'
nohup コマンド > ファイル &指定したファイル(エラー出力を含む)nohup: ignoring input and redirecting stderr to stdout
nohup コマンド > ファイル 2>&1 &指定したファイルなし(案内メッセージはファイルの1行目)
nohup コマンド > /dev/null 2>&1 &破棄なし

3️⃣ nohup プロセスの確認と終了

  • ↪️ jobs, ps, kill

jobs の一覧には現在のシェルで起動したジョブしか表示されないため、ターミナルを閉じて再接続したあとは、nohup プロセスを ps -p で PID を指定して確認します。同じシェルにいる間は、jobs -l でジョブ番号と PID、状態をまとめて確認します。

jobs -l
[1]+ 3431609 Running                 nohup sleep 300 &

ps -p の後ろに PID を書き、-o で列を選ぶと、そのプロセスの1行だけが表示されます。STAT の S はイベントを待って休止している状態、ELAPSED は開始してから経過した時間です。

ps -p 3431609 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3431609 S          00:03 sleep 300

終了するときは kill の後ろに PID を書きます。

kill 3431609

kill は何も出力せず、続けて jobs を実行すると、そのジョブが Terminated と表示されたあと一覧から消えました。

jobs
[1]+  Terminated              nohup sleep 300

同じ PID で ps をもう一度実行するとヘッダーだけが表示され、プロセスが終了したことを確認できました。

ps -p 3431609 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD

nohup は切断シグナルだけを無視するため、[kill -HUP] で同じシグナルを直接送っても終了しません。nohup で起動した sleep 305 と、nohup なしで起動した sleep 306 に kill -HUP を送りました。

kill -HUP 3437119 3437128

続けて jobs -l で確認すると、nohup のほうだけが Running で残り、sleep 306 は Hangup で終了していました。

jobs -l
[1]- 3437119 Running                 nohup sleep 305 &
[2]+ 3437128 Hangup                  sleep 306

kill にシグナルを指定しないと SIGTERM を送るため、nohup で起動したジョブも [kill PID] で終了します。

4️⃣ nohup コマンドと disown の比較、オプション

  • ↪️ disown -h と tmux を選ぶ基準、オプションのまとめ

🔲 nohup と disown の比較

disown はすでに起動したジョブに使う bash の組み込みコマンドで、nohup なしで & を付けて起動したジョブを、あとからターミナルの切断シグナルから切り離すときに使います。disown は出力を nohup.out に回さないため、出力のあるジョブは起動するときに > ファイルで出力先を決めておきます。

Bash 公式マニュアルによると、disown をオプションなしで使うとそのジョブが jobs の一覧から外れ、disown -h は一覧に残したまま切断シグナルだけを送らないようにします。まず sleep 302 を起動してから disown を実行しました。

sleep 302 &
[1] 3433230
disown

disown は何も出力せず、続けて実行した jobs -l も空の結果でした。

jobs -l

次に sleep 303 を起動し、ジョブ番号 %1 に disown -h を実行しました。

sleep 303 &
[1] 3433343
disown -h %1

jobs -l で確認すると、ジョブは一覧にそのまま残っていました。

jobs -l
[1]+ 3433343 Running                 sleep 303 &

ここに何の処理もしない sleep 304 をもう1つ起動してターミナルを閉じ、別のシェルから3つの PID を確認しました。

sleep 304 &
[2] 3433474
ps -p 3433230,3433343,3433474 -o pid,stat,etime,cmd
    PID STAT     ELAPSED CMD
3433230 S          00:11 sleep 302
3433343 S          00:08 sleep 303

disown と disown -h を使った2つのジョブは残り、何の処理もしなかった sleep 304 だけが終了しました。4つの方法を比べると次のとおりです。

方法使うタイミングjobs の一覧ターミナルを閉じたあと出力
nohup コマンド &起動するとき残る残るnohup.out または指定したファイル
コマンド & のあと disown起動したあと省略残る変えない
コマンド & のあと disown -h起動したあと残る残る変えない
コマンド & のみ—残る終了変えない

作業画面を呼び戻して続けて入力する必要がある作業には tmux のようなターミナルマルチプレクサーが向いており、一度起動して結果だけをファイルで受け取る作業なら nohup で十分です。

🔲 nohup コマンドのオプション

📌 主なオプション: この記事で実行した結果

オプション作業この記事で確認した結果
--versionバージョン情報を表示して終了AlmaLinux 9.8 サーバーは nohup (GNU coreutils) 8.32、Debian 12 サーバーは nohup (GNU coreutils) 9.1

📎 その他のオプション: 公式マニュアルより

オプション作業
--helpヘルプを表示して終了

🔲 nohup コマンドシミュレーター

下のシミュレーターで nohup を使ってジョブを起動し、🔌 チップでターミナルを閉じて再接続したあと、どのプロセスが残るかを実際に確かめられます。

nohup コマンドシミュレーターcoreutils 8.32
[root@server work]#
ブラウザーの中だけで動作し、実際のプロセスは起動しません。sleep の時間は実際の時計どおりに流れ、↑↓ で前に入力したコマンドを呼び出せます。

🔢 FAQ & おすすめコンテンツ

GNU 公式マニュアルによると、nohup 自体が失敗すると 125、コマンドは見つかったが実行できないと 126、コマンドが見つからないと 127 で終了します。AlmaLinux 9 サーバーでコマンドなしで nohup だけを入力したときは 125、実行権限のない ./job.sh は 126、存在しないコマンド nosuchcmd は 127 でした。

nohup は nice 値を変えないため、[nohup nice -n 10 sleep 307 &] のように nice を一緒に使います。こうして起動した sleep を ps で確認すると、NI 列は 10、STAT は低い優先度を表す N が付いた SN でした。

nohup コマンドのオプションは [--help] と [--version] の2つだけです。GNU 公式マニュアルによると、オプションは実行するコマンドより前に書きます。

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 1   +   3   =