助け合いフォーラム
LinuC Lv1-101(Ver10.0)
問題ID : 34706
問題を開く
現在実行中のhttpdのプロセスを全て表示するために
$ ps ax | grep httpd
を実行した。
結果を確認したところ、このコマンドに含まれる grep httpd まで抽出されているため 1件多いようである。
この問題を解決できるコマンドはどれか。(2つ選択)
$ ps ax | grep httpd
を実行した。
結果を確認したところ、このコマンドに含まれる grep httpd まで抽出されているため 1件多いようである。
この問題を解決できるコマンドはどれか。(2つ選択)
正解
pgrep httpd
ps ax | grep httpd | grep -v grep
解説
pgrepコマンドを使用すると、実行中のプロセスから特定の名前を持つプロセスIDを検索することができます。pgrepコマンドは検索対象に自分自身を含みません。
pgrepコマンドの書式は以下のとおりです。
pgrep [ オプション ] 検索パターン
以下2例のプロセスIDを比較すると、pgrepの実行例の結果には「検索のために実行したコマンド」は含まれていないことが確認できます。
grepによる検索の実行例:
pgrepによる検索の実行例:
したがって正解の1つめは
・pgrep httpd
です。
またこの問題は、pgrepを使用せずに、grepのオプションを利用して解決することもできます。
正解の2つめは
・ps ax | grep httpd | grep -v grep
です。
ファイルや標準入力から、正規表現のパターンにマッチする文字列を含む行を抽出するにはgrepコマンドを利用します。
grepコマンドの書式と主なオプションは以下のとおりです。
grep [オプション] 検索パターン [ファイル名]
上表より、-v オプションを使用するとマッチした検索結果から除外できるので、
ps ax | grep 検索パターン | grep -v grep
とすることで抽出結果から「grep 検索パターン」を除いた結果を得られます。
以上が正答に関する解説です。
ここからは、設問に登場するコマンド
$ ps ax | grep httpd
と、設問の内容について説明します。
psコマンドは現在実行中のプロセスを確認することができます。
psコマンドの書式と主なオプションは以下のとおりです。
ps [オプション]
※「-」を付けないBSDオプションと、「-」で始まるUNIXオプションがある
上表より、aオプションは他ユーザのプロセスも表示し、さらにxオプションは制御端末のないデーモン等のプロセスも表示しますので、
ps ax
とすると実行中の全プロセスを確認することができます。
標準出力に出力されたコマンドの実行結果を、別のコマンドの標準入力に渡すにはパイプ(|)を利用します。
したがって
$ ps ax | grep httpd
により行われているのは、「現在実行中の全プロセスの一覧をgrepに標準入力として渡し、検索パターン(プロセス名)とマッチする行を抽出して表示する」ことです。
この抽出結果には、検索するために実行した「grep 検索パターン」も含まれていますが、正解のコマンドを用いることでそれを取り除いて表示できます。
以上が設問の内容です。
なお、「httpd」とは、「httpサービスを提供するデーモン(常駐プログラム)」のことで、Apache HTTP Serverが提供するメインの機能にあたります。
(httpd=Apache HTTP Server、というわけではなく、Apache以外のhttpdも存在します。)
その他の選択肢については以下のとおりです。
・egrep httpd
egrepだけではプロセス名を検索できないため誤りです。
egrepは拡張正規表現を用いながらgrepと同様の検索ができるコマンドです。
・ps ax | grep httpd | grep -E httpd
grep -Eはegrepと同じ動作をし、拡張正規表現をgrepコマンドで扱えますが、grepの結果に対してgrep -Eをしても検索コマンド自身を抽出してしまう問題は解決できませんので、誤りです。
・ps ax | grep -p httpd
grepに -p というオプションはないので誤りです。
pgrepと同じ機能はgrepのオプション群にはありません。
pgrepコマンドの書式は以下のとおりです。
pgrep [ オプション ] 検索パターン
以下2例のプロセスIDを比較すると、pgrepの実行例の結果には「検索のために実行したコマンド」は含まれていないことが確認できます。
grepによる検索の実行例:
pgrepによる検索の実行例:
したがって正解の1つめは
・pgrep httpd
です。
またこの問題は、pgrepを使用せずに、grepのオプションを利用して解決することもできます。
正解の2つめは
・ps ax | grep httpd | grep -v grep
です。
ファイルや標準入力から、正規表現のパターンにマッチする文字列を含む行を抽出するにはgrepコマンドを利用します。
grepコマンドの書式と主なオプションは以下のとおりです。
grep [オプション] 検索パターン [ファイル名]
上表より、-v オプションを使用するとマッチした検索結果から除外できるので、
ps ax | grep 検索パターン | grep -v grep
とすることで抽出結果から「grep 検索パターン」を除いた結果を得られます。
以上が正答に関する解説です。
ここからは、設問に登場するコマンド
$ ps ax | grep httpd
と、設問の内容について説明します。
psコマンドは現在実行中のプロセスを確認することができます。
psコマンドの書式と主なオプションは以下のとおりです。
ps [オプション]
※「-」を付けないBSDオプションと、「-」で始まるUNIXオプションがある
上表より、aオプションは他ユーザのプロセスも表示し、さらにxオプションは制御端末のないデーモン等のプロセスも表示しますので、
ps ax
とすると実行中の全プロセスを確認することができます。
標準出力に出力されたコマンドの実行結果を、別のコマンドの標準入力に渡すにはパイプ(|)を利用します。
したがって
$ ps ax | grep httpd
により行われているのは、「現在実行中の全プロセスの一覧をgrepに標準入力として渡し、検索パターン(プロセス名)とマッチする行を抽出して表示する」ことです。
この抽出結果には、検索するために実行した「grep 検索パターン」も含まれていますが、正解のコマンドを用いることでそれを取り除いて表示できます。
以上が設問の内容です。
なお、「httpd」とは、「httpサービスを提供するデーモン(常駐プログラム)」のことで、Apache HTTP Serverが提供するメインの機能にあたります。
(httpd=Apache HTTP Server、というわけではなく、Apache以外のhttpdも存在します。)
その他の選択肢については以下のとおりです。
・egrep httpd
egrepだけではプロセス名を検索できないため誤りです。
egrepは拡張正規表現を用いながらgrepと同様の検索ができるコマンドです。
・ps ax | grep httpd | grep -E httpd
grep -Eはegrepと同じ動作をし、拡張正規表現をgrepコマンドで扱えますが、grepの結果に対してgrep -Eをしても検索コマンド自身を抽出してしまう問題は解決できませんので、誤りです。
・ps ax | grep -p httpd
grepに -p というオプションはないので誤りです。
pgrepと同じ機能はgrepのオプション群にはありません。
参考
プロセスとは、システム上で動作しているプログラムの最小単位のことです。
プログラムを実行すると1つまたは複数のプロセスがカーネルによって自動的に生成され、プログラムが終了するとプロセスはカーネルによって自動的に削除されます。
psコマンドで現在実行中のプロセスを確認することができます。
psコマンドの書式と主なオプションは以下のとおりです。
ps [オプション]
※「-」を付けないBSDオプションと、「-」で始まるUNIXオプションがある
プログラムを実行すると1つまたは複数のプロセスがカーネルによって自動的に生成され、プログラムが終了するとプロセスはカーネルによって自動的に削除されます。
psコマンドで現在実行中のプロセスを確認することができます。
psコマンドの書式と主なオプションは以下のとおりです。
ps [オプション]
※「-」を付けないBSDオプションと、「-」で始まるUNIXオプションがある
正解が誤っている?
h
hintal
投稿日 2023/07/02
正解の選択肢に「ps ax | grep httpd | grep -v httpd」がありますが、これだとgrep自身とその他httpdのプロセスすべて除外してしまいます。
「ps ax | grep httpd | grep -v grep」が正解ではないでしょうか。
スタッフからの返信
この投稿に対して返信しませんか?
s staff_ueda
2023/07/02 14:22
hintal 様 ご指摘の点を修正いたしました。 ご報告いただきまして、誠にありがとうございます。