disownコマンドとは?Linuxでジョブをシェルの管理対象から外す方法

Linux

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接続時の運用がよりスムーズになります。

コメント

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