スクリプトを作成して変数として使用しています。
RESULT1=`ps -ef | grep -w "PHANTOM PHA-WRM-EXPIRE"`.
ps
2つのPIDが一覧表示されます。
[xhobando@noitu TNOITU]$ ps -ef | grep -w "/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE"
phantomxg 7250 1 0 12:15 ? 00:00:01 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE
phantomxg 17071 1 0 Oct04 ? 00:05:27 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE
ここで達成したいのは、両方のgrep
オプションではなく、最初のPIDのみを見つけることです。
これが意味があるかどうか教えてください。
ベストアンサー1
PCREサポートでGNUを使用するgrep
(rhelで実装):
ps -Ao pid= -o args= |
grep -Pom1 '^\s*\K\d+(?= \Q/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE\E)'
どこ
-P
P
erlに似た正規表現に切り替えます(\s
、、、、、、、すべてのPerlに似た拡張の場合)。\K
\d
(?=...)
\Q
\E
-o
grep
一致する部分だけを出力するように指示します。-m1
grep
一致する最初の行のみを出力するように指示します。
(3つのフラグはすべてGNU拡張ですが、GNUはRHELで見つかった実装grep
です。)grep
ps -f
気にしないいくつかのフィールドを印刷するのではなく、必要なフィールドだけを選択し(サフィックスpid
はヘッダーを削除する)、コマンドラインでより簡単に一致させることができます。args
=
ここで正規表現は、^
ゼロ個以上の ( *
) 空白文字 ( ) で構成される一連の先行 ( ) を探し、一致の始まりを表示し ( )、その後に\s
1 つ以上の ( ) 数字で\K
構成されるシーケンス ( ) を探します。シーケンスの後には、スペースと希望の引数(正規表現演算子のリストを含めることができる他の引数に置き換えるのを容易にするために引用)が続きます(一致の一部ではないプレビュー演算子)。+
\d
(?=...)
\Q
\E
または単に使用してくださいpgrep
:
pgrep -f '^/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE' | head -n 1
引数リスト(空白文字で連結)が始まる最初のプロセスのpidを返します/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE
。
ps
プロセスは、またはデフォルトで出力のpidに基づいて数値順にソートされます。pidpgrep
数値は最大値に達すると改行されるため、取得される数値は多少ランダムです。
--sort start_time
たとえば、--sort -start_time
開始ps
時間で並べ替えたり、-o
/を追加したりできます。-n
最も古い/最新情報そしてpgrep
削除| head -n 1
)最新の起動プロセスであることを保証する代わりに、最も早い/最近起動されたプロセスを取得したい場合処刑されたudt
最初/最後のプロセスは、寿命の間に複数のコマンドを実行でき、しばしば実行します。
質問に対するご意見からわかるように、現在の作業ディレクトリに基づいてプロセスを選択するには、次のzsh
方法を使用できます。
pids=(
/proc/<1->(e[$'[[ $REPLY/cwd -ef /tdata/PHANTOM &&
$(<$REPLY/cmdline) = /usr/ud/bin/udt\0PHANTOM\0PHA-WRM-EXPIRE\0* ]]']:t)
)
ここで、最初の3つの引数で、/tdata/PHANTOM
およびがあるプロセスを探します。/usr/ud/bin/udt
PHANTOM
PHA-WRM-EXPIRE
ただし、プロセスにスーパーユーザー権限がない場合は、自分のプロセスの作業ディレクトリのみを見つけることができます。