1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Bash】バックグラウンド実行(fg、bg)の事

Last updated at Posted at 2025-03-02

はじめに

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です。

実行中のプロセスをバックグラウンドに移動

プロセスがすでにフォアグラウンドで実行されている場合:

  1. Ctrl+Zでプロセスを一時停止する
  2. 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

出力の+記号は、fgbgコマンドを引数なしで実行した場合にデフォルトで操作される「カレントジョブ」を示します。-記号は「次のカレントジョブ」を示します。

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でのプロセス管理は効率的なコマンドライン作業のための強力なツールになります。
この記事で紹介した&jobsfgbgなどのコマンドを使う事で、複数のタスクを効率的に管理し、生産性を向上させることが出来るでしょう。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?