Linux バックグラウンド管理

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Linux は、複数のプロセスを同時に管理する強力な機能を提供しています。その主要な機能の 1 つは、プロセスをバックグラウンドで実行する機能です。これにより、長時間実行されるプロセスが実行されている間も、ターミナルを他のタスクに使用し続けることができます。

この実験では、Linux システムでバックグラウンドプロセスを管理するための重要な技術を学びます。これらのスキルは、コマンドライン環境での効率的なマルチタスクに不可欠であり、システム管理者や開発者によって日常的に使用されています。

この実験の終了時には、バックグラウンドプロセスを起動し、その状態を監視し、効果的に制御する方法を理解するようになります。これらのスキルは、システムリソースをよりよく活用し、Linux システムで作業する際の生産性を向上させるのに役立ちます。

バックグラウンドでプロセスを起動する

Linux では、コマンドの末尾にアンパサンド (&) を追加することで、コマンドをバックグラウンドで実行することができます。これにより、シェルはプロセスをバックグラウンドで実行し、コマンドが実行されている間もターミナルを引き続き使用することができます。

長時間実行されるプロセスをシミュレートする簡単なスクリプトを作成して実行してみましょう。

まず、プロジェクトディレクトリにいることを確認します。

cd ~/project

次に、nano テキストエディタを使用して long_running.sh という名前のスクリプトファイルを作成します。

nano ~/project/long_running.sh

nano エディタが開いたら、以下のコードを入力します。

#!/bin/bash
echo "Starting a long process..."
sleep 15
echo "Process completed"

このスクリプトは以下のことを行います。

  1. 開始メッセージを表示します。
  2. 15 秒間一時停止します(時間のかかるタスクをシミュレートします)。
  3. 完了メッセージを表示します。

nano でファイルを保存するには、以下の手順を行います。

  1. Ctrl + O を押してファイルを書き込みます。
  2. Enter を押してファイル名を確認します。
  3. Ctrl + X を押して nano を終了します。

次に、スクリプトを実行可能にする必要があります。

chmod +x ~/project/long_running.sh

では、まずこのスクリプトをフォアグラウンドで実行して、その動作を確認しましょう。

./long_running.sh

以下のように表示されます。

Starting a long process...

スクリプトが完了するまで 15 秒間、ターミナルが占有されることに注意してください。この間は新しいコマンドを入力することができません。

では、同じスクリプトを末尾にアンパサンド (&) を追加してバックグラウンドで実行してみましょう。

./long_running.sh &

以下のような出力が表示されます。

[1] 1234
Starting a long process...

この出力は以下のことを示しています。

  • [1] - シェルによって割り当てられたジョブ番号
  • 1234 - プロセス ID (PID)。この番号は、あなたのシステムでは異なる場合があります。
  • スクリプトの開始メッセージ

スクリプトはまだ実行中ですが、シェルプロンプトがすぐに戻り、新しいコマンドを入力することができます。15 秒後に、完了メッセージが表示されます。

Process completed
[1]+  Done                    ./long_running.sh

これにより、バックグラウンドプロセスが実行を完了したことが確認できます。

バックグラウンドプロセスの表示

バックグラウンドでプロセスを起動した後は、それらを追跡する方法を知る必要があります。Linux では、現在のターミナルセッションで実行中のすべてのバックグラウンドプロセスを表示するために jobs コマンドが提供されています。

複数のバックグラウンドプロセスを起動してから、それらを表示してみましょう。

## Start the first background process
./long_running.sh &

以下のような出力が表示されます。

[1] 1234
Starting a long process...

次に、2 つ目のバックグラウンドプロセスを起動します。

## Start the second background process
./long_running.sh &

以下のような出力が表示されます。

[2] 1235
Starting a long process...

すべてのバックグラウンドプロセス(ジョブ)を表示するには、jobs コマンドを使用します。

jobs

以下のような出力が表示されるはずです。

[1]  Running                 ./long_running.sh &
[2]- Running                 ./long_running.sh &

これは、2 つのバックグラウンドジョブが実行中であることを示しています。角括弧内の数字は、他のコマンドで特定のジョブを参照するために使用できるジョブ ID です。

jobs コマンドにはいくつかの便利なオプションがあります。

  • jobs -l - ジョブ情報とともにプロセス ID を表示します。
  • jobs -p - ジョブのプロセス ID のみを表示します。

-l オプションを試して、詳細を確認してみましょう。

jobs -l

出力にはプロセス ID が含まれます。

[1]  1234 Running                 ./long_running.sh &
[2]- 1235 Running                 ./long_running.sh &

次のステップに進む前に、両方のプロセスが完了するのを待ちます。以下のようなメッセージが表示されます。

Process completed
[1]+  Done                    ./long_running.sh
Process completed
[2]+  Done                    ./long_running.sh

プロセスをフォアグラウンドとバックグラウンド間で移動する

Linux では、プロセスをフォアグラウンドとバックグラウンドの状態間で移動させることができます。これは以下のような場合に特に便利です。

  • フォアグラウンドでプロセスを起動したが、ターミナルを他の作業に使用する必要がある場合
  • バックグラウンドで実行中のプロセスをフォアグラウンドに移動させて、それと対話したい場合

fg(フォアグラウンド)と bg(バックグラウンド)コマンド、およびプロセスの一時停止を使って、これを行う方法を学んでみましょう。

まず、長時間実行されるスクリプトをフォアグラウンドで(& を付けずに)起動します。

./long_running.sh

以下のように表示されます。

Starting a long process...

シェルプロンプトが戻ってこないことに注意してください。ターミナルは現在、フォアグラウンドで実行されているこのプロセスによって占有されています。

このプロセスを一時停止(中断)して、ターミナルのコントロールを取り戻すには、以下の操作を行います。

  1. Ctrl + Z を押します。

以下のような出力が表示されます。

^Z
[1]+  Stopped                 ./long_running.sh

プロセスは現在一時停止されており、実行されていません。これを jobs コマンドで確認できます。

jobs

出力:

[1]+  Stopped                 ./long_running.sh

一時停止されたプロセスをバックグラウンドで再開するには、bg コマンドを使用します。

bg %1

%1 はジョブ番号 1 を指します。以下のように表示されます。

[1]+ ./long_running.sh &

プロセスは現在バックグラウンドで実行されています。jobs で確認しましょう。

jobs

出力:

[1]+  Running                 ./long_running.sh &

バックグラウンドで実行されているプロセスをフォアグラウンドに移動させるには、fg コマンドを使用します。

fg %1

プロセスは再びフォアグラウンドで実行され、完了するまでターミナルは占有されます。

./long_running.sh
Process completed

プロセスが完了すると、シェルプロンプトが戻ります。

ターミナルを閉じた後もプロセスを実行し続ける

& を使ってバックグラウンドでプロセスを実行する場合、ターミナルを閉じるとそのプロセスは終了します。ターミナルを閉じた後もプロセスを実行し続けるには、nohup コマンドを使用できます。

nohup(「no hang up」の略)は、ターミナルが閉じられたときにプロセスに送信される SIGHUP(ハングアップ)シグナルをプロセスが受け取らないようにします。

スクリプトを修正して、より長時間実行するようにしましょう。

nano ~/project/long_running.sh

内容を以下のように更新します。

#!/bin/bash
echo "Starting a very long process..."
sleep 60
echo "Process completed" > ~/project/completed.txt

nano を保存して終了します(Ctrl+O、Enter、Ctrl+X)。

では、nohup を使ってスクリプトを実行しましょう。

nohup ./long_running.sh &

以下のような出力が表示されます。

[1] 1234
nohup: ignoring input and appending output to 'nohup.out'

スクリプトの出力はターミナルに表示されません。代わりに、nohup.out というファイルにリダイレクトされます。このファイルを確認できます。

cat nohup.out

以下のように表示されるはずです。

Starting a very long process...

この時点でターミナルを閉じても、プロセスは実行し続けます。プロセスが完了すると、nohup.outcompleted.txt の両方に書き込まれます。

すべてのターミナルでバックグラウンドで実行されているプロセスを表示するには、ps コマンドを使用します。

ps aux | grep long_running.sh

以下のような表示がされます。

labex     1234  0.0  0.0   8160   736 pts/0    S    12:34   0:00 /bin/bash ./long_running.sh
labex     1235  0.0  0.0  14428  1020 pts/0    S+   12:34   0:00 grep --color=auto long_running.sh

プロセスが完了するのを待ちます(または必要に応じて終了させます)。

## If you want to terminate the process:
kill %1

まとめ

この実験では、Linux でバックグラウンドプロセスを管理するための重要な技術を学びました。

  1. バックグラウンドプロセスの起動& 演算子を使用してバックグラウンドでプロセスを起動する方法を学び、プロセスが実行中でもターミナルを引き続き使用できるようになりました。

  2. バックグラウンドプロセスの表示jobs コマンドを使用して、現在のターミナルセッションで実行されているすべてのバックグラウンドプロセスを表示しました。

  3. プロセスをフォアグラウンドとバックグラウンド間で移動するCtrl+Z を使用してプロセスを一時停止し、bg を使用してバックグラウンドで再開し、fg を使用してフォアグラウンドに戻す操作を練習しました。

  4. ターミナルを閉じた後もプロセスを実行し続けるnohup コマンドを使用して、ターミナルセッションが終了してもプロセスを実行し続ける方法を学びました。

これらのスキルは、Linux 環境で効果的なマルチタスクを行うために不可欠です。これらにより、複数のプロセスを同時に実行し、ターミナルリソースを効率的に利用し、ターミナルを開いたままにせずに長時間実行されるプロセスを維持し、プロセスの実行状態を管理することができます。

これらの技術を使えば、サーバーの管理、アプリケーションの開発、またはシステム管理タスクを行う場合でも、Linux コマンドライン環境でより効率的かつ効果的に作業することができます。