はじめに

こんにちは!今回はdisownコマンドについて解説します。

disownは、バックグラウンドジョブをシェルの管理外にするコマンドです。nohupの代わりに使うことで、ターミナルを閉じた後もプロセスを実行し続けることができます。

シェルの組み込みコマンドなので、nohupよりも軽量で、すでに実行しているプロセスに対して使えるのが便利ですね!


disownコマンドとは

disownは、シェルに組み込まれたコマンドで、バックグラウンドジョブをシェルの管理から外します。

通常、バックグラウンドで実行しているジョブは、ターミナルを閉じるとシェルから終了シグナルを受け取って、プロセスも終了してしまいます。しかし、disownでジョブをシェルから切り離すと、ターミナルを閉じてもプロセスは実行を続けます。

すでに実行中のプロセスに対して使えるので、計画外のバックグラウンド実行にも対応できます。


基本構文

1
disown [ジョブID]
  • ジョブIDを指定しなければ、すべてのバックグラウンドジョブを切り離します
  • ジョブID形式: %1, %2 など

主なオプション

オプション 説明
なし すべてのバックグラウンドジョブを切り離す
%n ジョブIDを指定して切り離す
-a すべてのジョブを切り離す
-r 実行中のジョブのみ切り離す

使用例

例1: 実行中のジョブを切り離す

1
2
sleep 1000 &
disown %1

実行結果:

1
[1] 12345

ジョブをシェルの管理外に移します。

例2: すべてのジョブを切り離す

1
2
3
sleep 100 &
sleep 200 &
disown -a

実行結果:

1
2
[1] 12345
[2] 12346

すべてのバックグラウンドジョブを一括で切り離します。

例3: 切り離したジョブをjobsで確認

1
2
3
sleep 1000 &
disown %1
jobs

実行結果:

1
2
[1] 12345
(disown後はjobsに表示されない)

切り離したジョブはjobsコマンドで表示されなくなります。

例4: 計画外のバックグラウンド実行を救済

1
2
3
4
5
./long_task.sh    # 前景で実行中...
# 実行を途中で止めたい!Ctrl+Z
./long_task.sh
disown
# ターミナルを閉じてもタスク続行

実行結果:

1
2
[1]+ Stopped ./long_task.sh
[1]+ ./long_task.sh &

停止中のジョブをバックグラウンドで再開して切り離します。

例5: 複数ジョブから特定のジョブのみ切り離す

1
2
3
4
5
sleep 100 &
sleep 200 &
sleep 300 &
disown %2
jobs

実行結果:

1
2
3
4
[1] 12345
[2] 12346
[3] 12347
(disown後:[1]と[3]のみ表示)

特定のジョブのみを切り離せます。

例6: ターミナルを閉じる前の確認

1
2
3
4
5
nohup command1 &
command2 &
disown -r
jobs
exit

実行結果:

1
実行中のジョブがすべて切り離される

ターミナルを閉じる前にすべてのジョブを確認して切り離します。

例7: プロセスの状態を確認

1
2
3
sleep 1000 &
disown %1
ps aux | grep sleep

実行結果:

1
user 12345  0.0  0.0  5000  400 ?  Ss  12:00  0:00 sleep 1000

psコマンドではプロセスは表示されます。

例8: バックグラウンド実行中に切り離す

1
2
3
./backup.sh &
# 処理の途中で...
disown %1

実行結果:

1
[1] 12345

実行中のプロセスをシェルから切り離せます。

例9: 実行中のジョブのみ切り離す

1
2
3
4
sleep 100 &
sleep 200
(Ctrl+Z で一時停止)
disown -r

実行結果:

1
実行中のジョブ(sleep 100)のみ切り離される

停止中のジョブは切り離されません。

例10: すべてのジョブの状態を確認してから切り離す

1
2
3
jobs -l
disown -a
jobs -l

実行結果:

1
2
disown前:全ジョブが表示される
disown後:ジョブが表示されない

ジョブの状態確認と切り離しを順序立てて実行します。


Tips・注意点

disownと nohup の違い

disownは既に実行中のプロセスに対して使えますが、nohupは実行時に指定します:

1
2
3
4
5
6
# nohupの場合:実行時に指定
nohup long_task &

# disownの場合:後から指定
long_task &
disown %1

jobsで表示されなくなる

1
2
3
4
sleep 1000 &
disown %1
jobs        # 表示されない
ps aux      # 表示される

disown後はjobsコマンドで表示されませんが、psコマンドではプロセスは実行中です。

ターミナル閉じる前に disown

1
2
3
4
./long_task &
disown
# ここでターミナルを閉じてもプロセスは続行
exit

ターミナルを閉じる前に、バックグラウンドジョブをdisownで切り離しましょう。

複数ジョブの管理

1
2
3
4
5
task1 &
task2 &
task3 &
disown %1 %2
jobs  # %3 のみ表示

複数のジョブを同時に切り離せます。


実践的な使い方

SSH接続中に計画外のバックグラウンド実行

1
2
3
4
5
6
ssh user@server
./sync_data.sh
# Ctrl+Z で一時停止
bg
disown
exit

計画外に停止させたプロセスを救済できます。

長時間タスクを途中からバックグラウンド化

1
2
3
4
5
./data_processing.sh    # 前景で実行中
(Ctrl+Z で一時停止)
bg
disown %1
# ターミナルを閉じても続行

すでに実行中のタスクをバックグラウンド化できます。

サーバー管理作業での活用

1
2
3
4
5
ssh admin@server
nohup backup_task &
nohup cleanup_task &
disown -a
logout

複数のメンテナンスタスクを実行して、すべて切り離します。


まとめ

disownコマンドのポイント:

  • バックグラウンドジョブをシェル管理外に移す
  • シェルの組み込みコマンド
  • 基本形: command &disown %1
  • 既に実行中のプロセスに対して使える
  • nohupよりも軽量
  • ターミナル閉じる前に実行
  • よく使う組み合わせ: bgdisown

計画外のバックグラウンド実行を救済できる便利なコマンド。nohupを使い忘れた時の救世主ですよ!