Linuxでバックグラウンド実行したジョブを、そのままシェルの管理対象から外したいと思ったことはありませんか?
そんなときに便利なのがdisownコマンドです。
disownコマンドを使うと、現在のシェルが管理しているジョブを管理対象から外せます。
ジョブ管理を行うjobs・bg・fgコマンドと一緒に覚えておくと、より柔軟にバックグラウンドジョブを扱えるようになります。
この記事では、disownコマンドの基本的な使い方から、nohupとの違い、ジョブ番号の指定方法、-hオプションまで初心者向けに分かりやすく解説します。
disownコマンドとは
disownは、現在のシェルで管理しているジョブをジョブテーブルから削除したり、SIGHUPシグナルの対象外にしたりするためのコマンドです。
Bashで利用できるシェル組み込みコマンド(ビルトインコマンド)であり、外部コマンドではありません。
disownコマンドの基本構文
disown [オプション] [%ジョブ番号]
現在のジョブを対象にする場合は、ジョブ番号を省略できます。
disown
現在のジョブを確認する
まずはjobsコマンドで現在のジョブを確認します。
jobs
実行例
[1]- Running python app.py &
[2]+ Running backup.sh &
ジョブ番号を確認してからdisownを実行すると分かりやすく管理できます。
ジョブ番号を指定して管理対象から外す
ジョブ番号を指定する場合は、%に続けて番号を指定します。
disown %2
ジョブ番号2が現在のシェルのジョブ管理対象から外れます。
現在のジョブを管理対象から外す
現在のジョブ(+が付いたジョブ)は番号を省略して指定できます。
disown
最もよく利用される書き方です。
-hオプションとは
-hオプションを指定すると、ジョブをジョブテーブルから削除せず、SIGHUPシグナルだけを受け取らないように設定できます。
disown -h %1
ジョブ一覧に残したまま、ログアウト時の影響を抑えたい場合に利用します。
nohupとの違い
| コマンド | 用途 |
|---|---|
disown |
実行中ジョブをシェル管理対象から外す |
nohup |
起動時からSIGHUPを無視して実行する |
nohupはプログラムの起動時に利用し、disownは既に起動しているジョブに対して利用する場面が多くあります。
bgコマンドと組み合わせる
Ctrl+Zで停止したジョブをバックグラウンド実行し、その後disownする流れもよく利用されます。
bg %1
disown %1
これにより、ジョブをバックグラウンドで実行しながらシェルの管理対象から外せます。
複数のジョブを管理対象から外す
複数のジョブがある場合は、それぞれジョブ番号を指定して管理対象から外せます。
disown %1 %2
指定したジョブだけがシェルのジョブ管理対象から外れます。
すべてのジョブを管理対象から外す
現在のシェルで管理しているすべてのジョブを対象にすることもできます。
disown -a
大量のバックグラウンドジョブを実行している場合に便利です。
実行中ジョブだけを対象にする
停止中のジョブを除き、実行中(Running)のジョブだけを対象にするには-rオプションを利用します。
disown -r
不要な停止中ジョブを残したまま、実行中のジョブだけを管理対象から外せます。
disown後の確認方法
ジョブを管理対象から外したあと、jobsコマンドを実行すると対象ジョブが表示されなくなる場合があります。
jobs
ただし、プロセス自体が終了したわけではありません。
実行中かどうかを確認する場合は、psコマンドやpgrepコマンドを利用します。
pgrep -a python
disownとjobsの違い
| コマンド | 役割 |
|---|---|
jobs |
現在のジョブ一覧を表示する |
disown |
ジョブをシェル管理対象から外す |
まずjobsでジョブ番号を確認し、その後disownを実行する流れが基本です。
SSH接続時の注意点
disownはジョブをシェルの管理対象から外すコマンドですが、必ずしもログアウト後の動作を保証するものではありません。
プログラムやシェルの設定によって挙動が異なる場合があるため、長時間実行する処理ではnohupやscreen、tmuxを利用する方が確実です。
よくあるエラー・注意点
disown: no such job と表示される
指定したジョブ番号が存在しない可能性があります。
まずはjobsコマンドでジョブ番号を確認してください。
jobs
ジョブが表示されない
既に終了しているか、現在のシェルで管理されていない可能性があります。
SSHを切断したらプロセスが終了した
disownだけでは環境によっては処理が継続しない場合があります。
ログアウト後も確実に動作させたい場合は、nohupやscreen、tmuxの利用を検討しましょう。
ジョブを終了したい
disownはジョブを終了するコマンドではありません。
終了する場合はkillコマンドを利用します。
kill %1
よくある質問
disownコマンドは何をするコマンドですか?
現在のシェルで管理しているジョブをジョブテーブルから外すためのコマンドです。
nohupとの違いは何ですか?
nohupはプログラム起動時からSIGHUPを無視して実行するのに対し、disownは実行中のジョブに対して利用できます。
ジョブ番号はどこで確認できますか?
jobsコマンドを実行すると確認できます。
disownするとプロセスは終了しますか?
いいえ。
ジョブ管理対象から外れるだけで、プロセス自体はそのまま実行されます。
すべてのシェルで利用できますか?
disownはBashなどのジョブ制御をサポートするシェルで利用できるビルトインコマンドです。
まとめ
disownコマンドは、Linuxで現在のシェルが管理しているジョブを管理対象から外すためのコマンドです。
特に次のコマンドは覚えておくと便利です。
| コマンド | 用途 |
|---|---|
disown |
現在のジョブを管理対象から外す |
disown %2 |
ジョブ番号を指定して管理対象から外す |
disown -h %1 |
SIGHUPの対象外にする |
disown -a |
すべてのジョブを管理対象から外す |
disown -r |
実行中ジョブだけを管理対象から外す |
jobs |
ジョブ一覧を確認する |
pgrep -a プロセス名 |
実行中プロセスを確認する |
Linuxでジョブ管理を行う際は、「jobsで確認 → bgで必要に応じてバックグラウンド化 → disownで管理対象から外す → psやpgrepで動作確認」という流れを覚えておくと、長時間実行する処理やSSH接続時の運用がよりスムーズになります。




コメント