nohup コマンド:使い方と nohup.out、ターミナルを閉じても実行を続ける方法
ターミナルを閉じたり 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] 3432892jobs -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 300nohup で起動した sleep 300 だけが残り、nohup なしで起動した sleep 301 はターミナルを閉じるときに一緒に終了しました。
nohup で起動したプロセスは、おやすみモードをオンにしたスマートフォンのようなものです。
nohup は coreutils パッケージに含まれるコマンドです。インストールされているバージョンは --version の1行目で確認します。AlmaLinux 9.8 サーバーは 8.32、Debian 12 サーバーは 9.1 でした。
nohup --version | head -1nohup (GNU coreutils) 8.32nohup --version | head -1nohup (GNU coreutils) 9.12️⃣ nohup.out と出力リダイレクト
出力先を指定しないと、nohup はコマンドの出力を現在のフォルダーの nohup.out に追記します。最初に作られた nohup.out はサイズが 0 で、パーミッションは作成したユーザーだけが読み書きできる -rw------- でした。
ls -l nohup.out-rw------- 1 root root 0 Oct 28 23:04 nohup.outGNU 公式マニュアルは、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.outstart
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] 3432059cat job.lognohup: ignoring input
start2>&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] 34321374つの実行形式で、出力が行った先とターミナルに表示されたメッセージは次のとおりです。
| 実行形式 | 出力先 | ターミナルに表示されたメッセージ |
|---|---|---|
| nohup コマンド & | 現在のフォルダーの nohup.out | nohup: 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 の一覧には現在のシェルで起動したジョブしか表示されないため、ターミナルを閉じて再接続したあとは、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 3431609kill は何も出力せず、続けて jobs を実行すると、そのジョブが Terminated と表示されたあと一覧から消えました。
jobs[1]+ Terminated nohup sleep 300同じ PID で ps をもう一度実行するとヘッダーだけが表示され、プロセスが終了したことを確認できました。
ps -p 3431609 -o pid,stat,etime,cmd PID STAT ELAPSED CMDnohup は切断シグナルだけを無視するため、[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 306kill にシグナルを指定しないと SIGTERM を送るため、nohup で起動したジョブも [kill PID] で終了します。
4️⃣ nohup コマンドと disown の比較、オプション
🔲 nohup と disown の比較
disown はすでに起動したジョブに使う bash の組み込みコマンドで、nohup なしで & を付けて起動したジョブを、あとからターミナルの切断シグナルから切り離すときに使います。disown は出力を nohup.out に回さないため、出力のあるジョブは起動するときに > ファイルで出力先を決めておきます。
Bash 公式マニュアルによると、disown をオプションなしで使うとそのジョブが jobs の一覧から外れ、disown -h は一覧に残したまま切断シグナルだけを送らないようにします。まず sleep 302 を起動してから disown を実行しました。
sleep 302 &[1] 3433230disowndisown は何も出力せず、続けて実行した jobs -l も空の結果でした。
jobs -l次に sleep 303 を起動し、ジョブ番号 %1 に disown -h を実行しました。
sleep 303 &[1] 3433343disown -h %1jobs -l で確認すると、ジョブは一覧にそのまま残っていました。
jobs -l[1]+ 3433343 Running sleep 303 &ここに何の処理もしない sleep 304 をもう1つ起動してターミナルを閉じ、別のシェルから3つの PID を確認しました。
sleep 304 &[2] 3433474ps -p 3433230,3433343,3433474 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3433230 S 00:11 sleep 302
3433343 S 00:08 sleep 303disown と 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 を使ってジョブを起動し、🔌 チップでターミナルを閉じて再接続したあと、どのプロセスが残るかを実際に確かめられます。
🔢 FAQ & おすすめコンテンツ
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。