はなぜ必要ですか?と を一緒にpgrep
使用できる場合、 はなぜ必要ですか? コマンドまたは があると奇妙です。ps
grep
pgrep
lsgrep
curlgrep
しかし、私が気づいた違いは、最初にtmuxセッションを開始すると、
tmux new -s foo
それから
ps aux | grep tmux
tmuxサーバプロセスを見つけることができませんが、
pgrep -l tmux
できます。しかし、 のようにtmux サーバー プロセスを確認できるように フラグを設定できないのはなぜでしょうか。 と の違いはps
何でしょうか。grep
pgrep
ps
grep
pgrep
答え1
コマンドには、一般的にはとps
という 2 つのフィールドがあり、この方法で検索します。1 つ目は、NUL で区切られたプログラム引数文字列です。2 つ目は、プログラムの「名前」です。これらは別々に保存され、(さまざまなオペレーティング システムで)args
comm
両方実行時にプログラム自体によって変更されることがあります。 などのプログラムはtmux
実際にそれを行います。
の出力ps
は機械で解析できない複数のフィールドにはエンコードされていない空白任意の長さの空白文字が存在するため、フィールドの境界を確実に決定することは不可能である。またフィールド区切り文字。 args
と は、comm
まさにそのような 2 つのフィールドです。 の出力は、ps
人間が判読できる形式のみです。
grep
出力が行全体のパターンマッチングである場合ps
、そのパターンを特定のフィールドに確実に固定する方法はありません。を除外する役に立つもの、そしてそもそもこの方法で探しているものをすべて排除することによって。
たとえば:
u
Linuxps
(-u
BSD 内) のオプションを選択するとps
、ユーザー名を含むフィールドがありuser
、grep
プログラム名を検索するパターンも一致することがあります。- 標準的な問題(「ps -ef | grep WDA と ps -ef | grep [W]DA の違いは何ですか?"、"プログラム名を一致させると、なぜこれほど多くのヒットがあるのでしょうか?"、"`ps | grep -v | grep` の 2 番目の grep の機能"、 そして多くのプロセスが他の場所で実行されている場合、問題となるのは、もちろん、 に渡されるパターンがプロセス自体のと
grep
一致することです。grep
args
- 環境文字列に一致する場合も発生する可能性があり、
_
環境変数によく見られるものを考えると、これは特に重要です。
%ps -a -x -e -o sid、通信、引数 | grep dbus-デーモン | ヘッド-n 4 25 nosh cyclog dbus-daemon/ (nosh) 25 dbus-daemon dbus-daemon --config-file ./system-wide.conf --nofork --address=unix:path=/run/dbus/system_bus_socket 989 dbus-daemon dbus-daemon --config-file ./per-user.conf --nofork --address=unix:path=/run/user/JdeBP/bus 15107 grep grep dbusデーモン % %clearenv --keep-path \ setenv WIBBLE tmux \ ps -a -x -e -o sid,comm,コマンド | grep tmux 15107 ps PATH=/usr/local/bin:/usr/bin:/bin WIBBLE=tmux ps -a -x -e -o sid,pid,comm,command %
言い換えると、grep
は行で構成されるテキスト ファイルに対して操作を行います。プロセス テーブルはテキスト ファイルではないため、これをテキスト ファイルであるかのように扱うと ( コマンドを使用して変換することによりps
)、フィールドに関する情報が失われます。
このような検索を実行するには、 以外の何かを使用してプロセス テーブルを参照しますps
。Linux では、/proc/${PID}/comm
引数文字列、環境文字列などについて、 および同様の疑似ファイルを直接参照できます。
あるいは、照合する特定のデータプロセス テーブルから、そのフィールドのみでパターン マッチングを実行します。このツールはテキスト ファイル用ではなく、プロセス テーブル用です。 と呼ぶことができますpgrep
。
もちろん、グリップの一方で、ps
出力を1つ書くこともできますできる(例えば) で処理するawk
と、は機械が読み取り可能な、空白をエンコードしvis()
、適切に認識できるフィールドを提供するawk
。欠点は、人間- 読み取り可能で、準拠しているはずのものとは少し異なりますps
。出力を渡してconsole-flat-table-viewer
読み取ります。☺
%システム制御 ps -p 740 -o sid,comm,args SID コマンド コマンド 25 dbus-daemon dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' % %システム制御 ps -A -o sid、comm、args、envs、tree | awk '{ if ("dbus-daemon"==$2) print $3; }' dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon\040--config-file\040./per-user.conf\040--nofork\040'--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon\040--fork\040--print-pid\0405\040--print-address\0407\040--session % %システム制御 ps -A -o sid、comm、args、envs、tree | awk '{ if ("dbus-daemon"==$2) print $3; }' | 未確認 dbus-daemon --config-file ./system-wide.conf --nofork '--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon --config-file ./per-user.conf --nofork '--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session %
参考文献
ps
。NetBSD 一般コマンドマニュアル。 2016-12-02.vis
。NetBSD ライブラリ関数マニュアル。 2017-04-22.- シュロミ・ノアック(2009-10-01)。 mysqld が生きているかどうかをテストしない方法。 code.openark.org をご覧ください。
- グレッグ・ウーリッジ。 「プロセスツリーを解析する際のリスク」。プロセス管理グレッグのウィキ。
- ジョナサン・デ・ボイン・ポラード(2015年)。
clearenv
。noshガイド. ソフトウェア。 - ジョナサン・デ・ボイン・ポラード(2015年)。
setenv
。noshガイド. ソフトウェア。 - ジョナサン・デ・ボイン・ポラード(2020年)。
ps
。noshガイド. ソフトウェア。 - ジョナサン・デ・ボイン・ポラード(2020年)。
list-process-table
。noshガイド. ソフトウェア。