はじめに
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 600
echo "Process completed"
このスクリプトは次のことを行います。
- 開始メッセージを出力します
- 10 分間一時停止します (時間のかかるタスクをシミュレートします)
- 完了メッセージを出力します
nano でファイルを保存するには:
Ctrl+Oを押してファイルを書き込みますEnterを押してファイル名を確認します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...
シェルプロンプトが戻ってこないことに注意してください。ターミナルは現在、フォアグラウンドで実行されているこのプロセスによって占有されています。
このプロセスを一時停止(中断)して、ターミナルのコントロールを取り戻すには、以下の操作を行います。
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.out と completed.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 でバックグラウンドプロセスを管理するための重要な技術を学びました。
バックグラウンドプロセスの起動:
&演算子を使用してバックグラウンドでプロセスを起動する方法を学び、プロセスが実行中でもターミナルを引き続き使用できるようになりました。バックグラウンドプロセスの表示:
jobsコマンドを使用して、現在のターミナルセッションで実行されているすべてのバックグラウンドプロセスを表示しました。プロセスをフォアグラウンドとバックグラウンド間で移動する:
Ctrl+Zを使用してプロセスを一時停止し、bgを使用してバックグラウンドで再開し、fgを使用してフォアグラウンドに戻す操作を練習しました。ターミナルを閉じた後もプロセスを実行し続ける:
nohupコマンドを使用して、ターミナルセッションが終了してもプロセスを実行し続ける方法を学びました。
これらのスキルは、Linux 環境で効果的なマルチタスクを行うために不可欠です。これらにより、複数のプロセスを同時に実行し、ターミナルリソースを効率的に利用し、ターミナルを開いたままにせずに長時間実行されるプロセスを維持し、プロセスの実行状態を管理することができます。
これらの技術を使えば、サーバーの管理、アプリケーションの開発、またはシステム管理タスクを行う場合でも、Linux コマンドライン環境でより効率的かつ効果的に作業することができます。



