web-dev-qa-db-ja.com

psの出力を解析する単一のコマンドを使用して、実行中のプロセスのpidを取得する方法は?

実行中のプロセスのPIDを返す単一の行を探しています。

現在私は持っています:

ps -A -o pid,cmd|grep xxx|head -n 1

そして、これはこぶしを返しますpid, command。出力の最初の数だけが必要で、残りは無視します。 sedまたはawkが役立つと思いますが、それらの経験は限られています。

また、これには別の問題があり、xxxが実行されていない場合はgrepのpidを返します。

そのプロセスを強制終了するなど、他の何かをするために出力を再利用したいので、1行にすることは本当に重要です。

22
sorin

プロセスのPIDだけが必要な場合は、可能であれば pgrep を使用できます。 pgrep <command>は、コマンドのpid(または実行中のコマンドのインスタンスが複数ある場合はpidのリスト)を返します。この場合、headまたは他の適切なコマンドを使用できます)
お役に立てれば!

28

あと1つコマンドが必要です。スペースで区切られた値の行の最初のフィールドのみが必要です。

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

さて、2つ。別のgrepを追加して、出力からgrep自体を削除しました。

7
chepner

Pgrepを使用するだけで、はるかに簡単です

pgrep -o -x xxxx

上記は正確な名前の最も古いプロセスを選択します

6
Lenny

pidof xxx Linuxで十分です

3
herve3527

Cygwinで実行しているため、-Aおよび-oは使用できませんが、次のようなものです。

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580
0
AlG

あなたは次のようなことができます

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

その場合、xxxはプロセス名である必要があり、アンカーのためにgrepを取得しません^

0
pizza