はじめに
bashでプロセス管理について書いてみました。
bassで作業する時、プロセス管理は基本的な事項の一つです。
長時間実行されるタスクを効率的に管理する方法は生産性を大幅に向上させます。
この記事では、Bashでのプロセスのフォアグラウンドとバックグラウンドでの実行、及びそれらの間での切り替え方法について詳しく説明します。
動作環境
執筆時点での情報ですが、以下の環境で動作確認を行なっています。
Ubuntu 24.04.1 LTS
bash 5.2.21
1. プロセスの基本概念
Unixベースのシステムでは、実行中のプログラムは「プロセス」と呼ばれます。
各プロセスには一意のプロセスID(PID)が割り当てられ、システムによって管理されます。
Bashでは、これらのプロセスを管理するための「ジョブ制御」機能が提供されています。
2. フォアグラウンドとバックグラウンドの違い
フォアグラウンドプロセス
- ターミナルを占有します。
- 入力を直接受け取り、出力を直接表示します。
- Ctrl+Cで中断できます。
- プロセスが完了するまで新しいコマンドを入力できません。
バックグラウンドプロセス
- ターミナルを占有しません。
- 他のコマンドと並行して実行されます。
- 通常、出力はターミナルに表示されますが、入力は受け付けません。
- プロンプトが即座に返されるため、他のコマンドを続けて実行できます。
3. バックグラウンドでのプロセス実行
コマンドをバックグラウンドでの起動
コマンドの末尾に&
を追加することで、プロセスをバックグラウンドで実行できます。
$ long_running_command &
[1] 1234
この出力の[1]
はジョブ番号で、1234
はプロセスIDです。
実行中のプロセスをバックグラウンドに移動
プロセスがすでにフォアグラウンドで実行されている場合:
-
Ctrl+Z
でプロセスを一時停止する -
bg
コマンドでバックグラウンドでの実行を再開する
$ long_running_command
^Z
[1]+ Stopped long_running_command
$ bg
[1]+ long_running_command &
4. ジョブ制御コマンド: jobs
, fg
, bg
jobs
jobs
コマンドは現在のターミナルで実行されているすべてのジョブ(プロセス)を表示します。
$ jobs
[1]- Running sleep 100 &
[2]+ Stopped vim document.txt
出力の+
記号は、fg
やbg
コマンドを引数なしで実行した場合にデフォルトで操作される「カレントジョブ」を示します。-
記号は「次のカレントジョブ」を示します。
fg
fg
コマンドはバックグラウンドプロセスをフォアグラウンドに移動します。
# ジョブ番号を指定してフォアグラウンドに移動
$ fg %1
# デフォルトでカレントジョブ(+マークのジョブ)が対象になる
$ fg
bg
bg
コマンドは停止したプロセスをバックグラウンドで再開します。
# ジョブ番号を指定してバックグラウンドで再開
$ bg %2
# デフォルトでカレントジョブが対象になる
$ bg
5. 実用的な例
例1: 長時間実行されるコマンドをバックグラウンドで実行
# バックグラウンドで圧縮を実行
$ tar -czf archive.tar.gz large_directory &
[1] 1234
# 他の作業を続ける
$ ls -la
$ cd another_directory
# ジョブの状態を確認
$ jobs
[1]+ Running tar -czf archive.tar.gz large_directory &
例2: フォアグラウンドプロセスをバックグラウンドに移動
# エディタを起動
$ vim large_file.txt
# Ctrl+Zで一時停止
^Z
[1]+ Stopped vim large_file.txt
# 他のコマンドを実行
$ ls -la
# 必要に応じてvimをフォアグラウンドに戻す
$ fg
例3: 複数のバックグラウンドジョブの管理
$ sleep 100 &
[1] 1234
$ sleep 200 &
[2] 1235
$ sleep 300 &
[3] 1236
$ jobs
[1] Running sleep 100 &
[2]- Running sleep 200 &
[3]+ Running sleep 300 &
# ジョブ2をフォアグラウンドに移動
$ fg %2
# Ctrl+Cで中断
^C
$ jobs
[1]- Running sleep 100 &
[3]+ Running sleep 300 &
6. プロセス管理の高度なテクニック
nohup: ログアウト後もプロセスを実行し続ける
通常、ユーザーがログアウトすると、そのユーザーが開始したバックグラウンドプロセスも終了します。
nohup
コマンドを使用すると、ログアウト後もプロセスを実行し続けることができます。
$ nohup long_running_command &
[1] 1234
nohup: ignoring input and appending output to 'nohup.out'
標準出力と標準エラーは、デフォルトでnohup.out
ファイルにリダイレクトされます。
disown: プロセスをシェルのジョブ制御から切り離す
disown
コマンドを使用すると、実行中のバックグラウンドプロセスをシェルのジョブ制御から切り離すことができます。
$ long_running_command &
[1] 1234
$ disown %1
これにより、シェルセッションを終了しても、プロセスは実行され続けます。
さいごに
Bashでのプロセス管理は効率的なコマンドライン作業のための強力なツールになります。
この記事で紹介した&
、jobs
、fg
、bg
などのコマンドを使う事で、複数のタスクを効率的に管理し、生産性を向上させることが出来るでしょう。