Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション10: マルチタスク(プロセスとジョブ)で知らなかったことをざっくりまとめてみた

目次

プロセスとは

プロセスとは、メモリ上で実行状態にあるプログラム(ファイル)のことです。 すごくざっくりいうとプロセスとは、サーバー上で実行中のプログラムのことです。 Linuxカーネルから見た時の処理の単位とも言えます。

(※)コマンドの実態はディスク上に保存されたファイルです。シェルからコマンドを実行すると、Linuxカーネルはディスクからコマンドのファイルを読み出してメモリに格納します。そのメモリに格納された内容に従って、CPUがプログラムを実行します。ここでメモリ上で実行可能状態にあるプログラムのことをプロセスと言います。

ジョブとは

ジョブとは、シェルのコマンドラインに入力している一つの行のことです。 シェルから見た処理の単位とも言えます。コマンドが一つだけの場合、プロセスとジョブは同じ数(1つ)になります。パイプラインにより2つ以上のコマンドを組み合わせると、ジョブは1つだが、プロセスはコマンドの数だけ生成されます。

(※)ctrl + zでジョブを一時停止することができます。ctrl + cでフォアグラウンドジョブを終了させることができます。

psコマンド

psコマンドは、process statusの略です。 psコマンドはプロセスの状態を確認するためのコマンドです。 TTYはどのターミナルでコマンドを実行したのかを表しています。TIMEはCPUの利用時間です。

[ec2-user@ip-10-0-10-10 repos]$ ps
  PID TTY          TIME CMD
22056 pts/0    00:00:00 bash
22824 pts/0    00:00:00 ps

(注) psコマンドにオプションを指定する場合、BSDオプション(ハイフンのつかないオプション)で指定することが多いです。

psコマンドのオプション

psコマンドは以下のようなオプションを持ちます。

オプション 意味
x 別のターミナルやデーモンを含めた全てのプロセスを表示
a 全てのユーザーのプロセスを表示
u 詳細情報も含めてプロセスを表示

デーモンとは

デーモンとは、 コンピュータ上で常時起動されている、特定の処理を行うプロセスのことです。 ざっくりいうとデーモンとは、コンピュータ上で常時起動して特定の処理を行うプログラムのことです。

例えば、WebサーバーはいつでもHTTPリクエストを処理できるように、httpd(HTTPデーモン)というプロセスを常時動かしています。

jobsコマンド

jobsコマンドは、ジョブの状態を確認するためのコマンドです。

[ec2-user@ip-10-0-10-10 repos]$ jobs
[ec2-user@ip-10-0-10-10 repos]$ sleep 10
^Z
[1]+  Stopped                 sleep 10
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Stopped                 sleep 10
[ec2-user@ip-10-0-10-10 repos]$ 

lオプションをつけて実行すると、プロセスIDも含めて実行中、停止中のジョブを表示することができます。lはlongの略です。

[ec2-user@ip-10-0-10-10 repos]$ jobs -l
[1]+ 22919 Stopped                 sleep 10

1つのジョブで2つのコマンドを組み合わせて実行した場合、jobsコマンドを実行すると、2つのコマンドに対応するプロセスが表示されました。つまり、2つのコマンドを組み合わせた1つのジョブなので、jobsコマンドの結果が1つのジョブだが、2つのプロセスが存在していることがわかりました。

[ec2-user@ip-10-0-10-10 repos]$ cat /etc/crontab | sleep 10
^Z
[1]+  Stopped                 cat /etc/crontab | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ ps
  PID TTY          TIME CMD
22056 pts/0    00:00:00 bash
22932 pts/0    00:00:00 sleep
22933 pts/0    00:00:00 ps
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Stopped                 cat /etc/crontab | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ jobs -l
[1]+ 22931 Done                    cat /etc/crontab
     22932 Stopped                 | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ 

ジョブが持つ3つの状態

ジョブは 3つの状態を持ちます。 「停止」、「フォアグラウンド」、「バックグラウンド(裏側で実行されている)です。

ジョブをフォアグラウンドに変更する

ジョブをフォアグラウンドに変更するためには、fgコマンドを実行します。

fg %ジョブ番号
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Stopped                 cat /etc/crontab | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ fg %1
cat /etc/crontab | sleep 10
[ec2-user@ip-10-0-10-10 repos]$ jobs
[ec2-user@ip-10-0-10-10 repos]$ 

ジョブをバックグラウンドに変更する

以下のコマンドでジョブをバックグラウンドにします。

bg %ジョブ番号

初めからコマンドをバックグラウンドで実行したい場合、&をつけます。

sleep 1000 &

ジョブを終了させる

フォアグラウンドのジョブを終了させるためには、ctrl + cを実行します。バックグラウンドのジョブを終了させたい場合、killコマンドを実行します。

[ec2-user@ip-10-0-10-10 repos]$ jobs
[ec2-user@ip-10-0-10-10 repos]$ sleep 1000 &
[1] 22965
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Running                 sleep 1000 &
[ec2-user@ip-10-0-10-10 repos]$ kill %1
[ec2-user@ip-10-0-10-10 repos]$ jobs
[1]+  Terminated              sleep 1000
[ec2-user@ip-10-0-10-10 repos]$ jobs

ちなみにkillコマンドにはプロセスも指定できて、プロセスを終了させることができます。

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

デーモン

フォアグラウンド