概要
Linuxにおいて、実行中のアプリケーションを管理するプロセスについてメモしておく。
実行環境
- macOS BigSur 11.4
- CentOS7 (macOS上でLinux環境を構築する方法はこちらを参考にしました)
プロセスとは?
Linuxでは、実行中のプログラム(アプリケーション)を管理する単位をプロセスと呼ぶ。
各プロセスは、優先度順(Nice値)や、時間ごとにCPUを使用するラウンドロビン方式、FIFO(First In First Out)方式などで、実行順序がスケジューリングされる。
ジョブ
シェルが管理するプログラムの単位をジョブという。
何かの作業中に後ろで動かすバックグラウンドジョブ、対のフォアグランドジョブ
例)
$ sleep 3600& (バックグランドで実行したい場合、'&'をつける。'sleep'はn秒スリープするプロセス)
$ sleep 3601&
$ sleep 3602&
$ jobs (実行中のジョブを確認するためのコマンド?)
[1] Running sleep 3600 &
[2]- Running sleep 3601 &
[3]+ Running sleep 3602 &
$ %1 (フォアグランドジョブにするジョブを指定、'%..'の使い方は様々)
sleep 3600
^Z ('Ctrl + z'でフォアグランドジョブをサスペンド(停止))
$ %- ('-'のついたジョブをフォアグランドジョブにする)
$ %% ('+'のついたジョブをフォアグランドジョブにする)
$ fg (+のついたものから順に実行していく?)
シグナル
プロセスにシグナルというイベントを送信して、プロセスを制御する。
よく使うのは、Ctrl + C
のプロセスを 終了させるシグナル。
kill -l
コマンドで、シグナル一覧を表示できる。
例)
$ cat loop.sh
while true
do
sleep 3600
done
:w (書き込み)
^Z (プロセスをサスペンド)
$ chmod 755 loop.sh
$ ./loop.sh
^C (割り込みシグナルを送信し、プロセスを終了する)
プロセス間通信
複数のプロセスがコミュニケーションを取りながら同期したり、動作を変更して達成することがある。これをプロセス間通信という。
詳しい動作は後々勉強することになると思われるため、ここではキーワードのみ書いておく。
- System V IPC(Inter Process Communication)
- 共有メモリ (shared memory)
- セマフォ (semaphore)
- メッセージキュー (message queue)
- ソケット
- パイプ
- シグナル
プロセスに関係するコマンド集
・ps
プロセスに付与されている一意のID(プロセスID)、自身のプロセスIDは$$
で取得可能。
現在実行中のプロセスのスナップショットを表示する。
PPIDを見れば親プロセスがわかる。
・trap
送信されたシグナルごとの処理を返す。
このコマンドを受け取った際には、プロセスが終了しないので、Ctrl + z
やkill [option]
コマンドなどで終了させる必要がある。
例)
trap echo "...Ctrl + C is pressed." 2
・stty -a
シグナルとキーの割り当てを返してくれる。
これは、慣れるまではめちゃめちゃお世話になりそうな予感。
終わりに
参考文献を最初から読んでいくと今回はネットワークについてまとめるべきである。
しかし、未だに理解できているとは言い難い。
今後Ruby on Railsを勉強しアプリケーションを作る予定であるため、その際に改めて記事にしたいと思う。
参考文献
この記事は以下の情報を参考にして執筆しました。
- Linux標準教科書(ver.3.0.2)