Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

【Linux】うっかりノーマル実行した重い処理を、後からバックグラウンド(nohup状態)に退避させる神コマンド「disown」

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

こんにちは!インフラエンジニアの皆さん、日々の運用保守お疲れ様です。

Linuxで時間のかかるバッチ処理や、巨大なファイルの圧縮・転送などを実行した直後に、

「あ、ノーマル実行しちゃった……!これ途中でTeraterm閉じたり、VPNが切れたりしたら処理も一緒に死ぬやつだ……。『nohup』つけて裏で動かせばよかった……」

と血の気が引いた経験はありませんか?

「今さらCtrl + Cで止めたら、ここまでの数時間が無駄になる。でもTeratermは閉じられないし、帰れない……」

そんな絶望的な状況を救ってくれるのが、今回ご紹介する disown コマンドです。これを使えば、普通に実行してしまったコマンドを、あとから「nohup」と同じ状態にすることができます!

スポンサーリンク
バッチ処理の自動化スキルは市場価値が高いです。今の自分の単価を調べてみませんか?
顧客常駐はもう嫌だ!社内SEへ転職するなら【社内SE転職ナビ】
Cursor・Claude Code・Codex AIスキルを学ぶなら
環境構築不要!AIエージェント開発を非エンジニアでも即実践【AI Agent Camp】

1. 「disown」コマンドとは?(Bash/Zsh対応)

通常、Linuxではログインシェル(端末)を閉じると、そのシェルから実行されていたプロセスに HUP信号(ハングアップシグナル/端末切断通知) が送られ、処理が強制終了してしまいます。

最初に nohup コマンドをつけて実行するのは、このHUP信号を無視(ignore)させるためです。

今回ご紹介する disown は、「すでに動き出しているジョブ(プロセス)に対して、後から『HUP信号を送らないでね』と設定できる」という、BashやZshに標準で備わっている神コマンドです。

2. 実践!普通に動かした処理を「後からnohup状態」にする手順

今まさに目の前の端末で重いコマンド(例:heavy-script.sh)がフォアグラウンドで動いてしまっていると仮定して、レスキュー手順を解説します。

ステップ①:実行中の処理を一時停止する

まずは、動いているコマンドを Ctrl + Z で一時停止(サスペンド)します。

Bash

$ ./heavy-script.sh
^Z
[1]+  Stopped                 ./heavy-script.sh

※これで一時的に処理が止まり、プロンプト(入力受付)が戻ってきます。

ステップ②:バックグラウンドで再開させる

プロンプトが戻ったら、bg コマンドを叩いて、先ほど止めた処理をバックグラウンドで再開(バックグラウンドジョブ化)させます。

Bash

$ bg
[1]+ ./heavy-script.sh &

※これで裏で処理が動き出しますが、このままだと端末を閉じたら一緒に死んでしまいます。

ステップ③:disownコマンドでHUP信号を対象外にする

ここで今回の主役、disown の登場です。以下のコマンドを実行します。

Bash

$ disown -h %1

%1 の部分は、bg コマンドを実行した時に表示されたジョブ番号(例:[1]+ なら 1)を指定します。

これでミッション完了です! この状態になれば、Teratermなどのリモート端末を今すぐ閉じても、サーバー側で処理は最後まで安全に走り続けます。安心してPCを閉じて帰りましょう。

3. 「disown」コマンドの便利なオプション一覧

disown には、状況に合わせて使い分けられる便利なオプションがいくつかあります。事前に jobs コマンドや ps コマンドでジョブ番号やPIDを確認してから使いましょう。

💡 カレントジョブ(直近のジョブ)を対象にする場合

直前に bg で裏に回したジョブなど、現在のカレントジョブに対して実行する場合は、番号を省略できます。

Bash

$ disown -h

💡 任意のジョブ番号を指定する場合

複数の処理を裏で動かしている場合は、jobs コマンドで番号を確認し、個別に指定します。

Bash

$ jobs
[1]-  Running                 ./script-A.sh &
[2]+  Running                 ./script-B.sh &

$ disown -h %2  # ジョブ番号2番だけをnohup状態にする

💡 動いている全てのジョブを対象にする場合

「裏で回している複数の処理、どれがどれだか分からないけど全部落としたくない!」という時は、-a オプションで丸ごと一括設定できます。

Bash

$ disown -ah

まとめ

  • うっかり重いコマンドを普通に叩いても諦めなくてOK

  • Ctrl + Zbgdisown -h %1 のコンボで後からnohup化できる

  • BashでもZshでも標準で利用可能

筆者もこのコマンドを知るまでは、泣く泣く処理を一度殺して再実行して時間を無駄にしていました……。

これからは「うっかり」やってしまっても、このdisownコンボさえ知っていれば涼しい顔で定時に退社できます。インフラエンジニアの生存戦略として、ぜひ覚えておいてくださいね!

タイトルとURLをコピーしました