10

私はたくさん使っps efps rfいます。

の出力例を次に示しますps rf

  PID TTY      STAT   TIME COMMAND
 3476 pts/0    S      0:00 su ...
 3477 pts/0    S      0:02  \_ bash
 8062 pts/0    T      1:16      \_ emacs -nw ...
15733 pts/0    R+     0:00      \_ ps xf
15237 ?        S      0:00 uwsgi ...
15293 ?        S      0:00  \_ uwsgi ...
15294 ?        S      0:00  \_ uwsgi ...

そして今日、スクリプトで uwsgi のマスター プロセスのみを取得する必要がありました (したがって、15237 のみが必要で、15293 や 15294 は必要ありません)。

今日の時点で、いくつか試してみましps rf | grep -v ' \\_ 'たが...もっときれいな方法が欲しいです。

また、unix.com のフォーラムから別の解決策を見つけました。

ps xf | sed '1d' | while read pid tty stat time command ; do [ -n "$(echo $command | egrep '^uwsgi')" ] && echo $pid ; done

しかし、まだ多くのパイプ醜いトリックがあります。

psそれを達成するためのオプションやよりクリーンなトリック(おそらくawkを使用)は本当にありませんか?

4

8 に答える 8

13

彼の回答のコメントについて @netcoder と話し合った後、彼は素晴らしいトリックを使用しました:D onを
使用すると、常に親が一番上に表示されます。fps

これはうまくいくはずです:

$ ps hf -opid -C <process> | awk '{ print $1; exit }'

コメントで述べたように、これはpid1 つのプロセスのみを返します。


私は一緒に行きます:

ps rf -opid,cmd -C <process-name> | awk '$2 !~ /^[|\\]/ { print $1 }'

あれは:

  • 実行中のプロセスを一覧表示しますr(またはeすべてが必要な場合)
  • 親子グラフとともにf
  • pid とコマンド名のみを出力する-opid,cmd
  • 指定されたプロセスのみ-C <process>

その後

  • コマンド ( -opid,cmd) である 2 番目のフィールドが a で始まらない場合、\または|親プロセスであるため、pid である 1 番目のフィールドを出力します。

簡単なテスト:

$ ps f -opid,cmd -Cchromium
  PID CMD
 2800 /usr/lib/chromium/chromium --type=zygote --enable-seccomp-sandbox
 2803  \_ /usr/lib/chromium/chromium --type=zygote --enable-seccomp-sandbox
 2899      \_ /usr/lib/chromium/chromium --type=renderer --enable-seccomp-sandbox --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/ConnnectB
 2906      |   \_ /usr/lib/chromium/chromium --type=renderer --enable-seccomp-sandbox --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/Connn
 [  ... snip ... ]
 2861      \_ /usr/lib/chromium/chromium --type=renderer --enable-seccomp-sandbox --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/ConnnectB
 2863          \_ /usr/lib/chromium/chromium --type=renderer --enable-seccomp-sandbox --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/Connn
 2794 /usr/lib/chromium/chromium --enable-seccomp-sandbox --memory-model=low --purge-memory-button --disk-cache-dir=/tmp/chromium
 2796  \_ /usr/lib/chromium/chromium --enable-seccomp-sandbox --memory-model=low --purge-memory-button --disk-cache-dir=/tmp/chromium
 3918  \_ /usr/lib/chromium/chromium --type=gpu-process --channel=2794.45.1891443837 --gpu-vendor-id=0x10de --gpu-device-id=0x0611 --gpu-driver-version -
25308  \_ [chromium] <defunct>
31932  \_ /usr/lib/chromium/chromium --type=plugin --plugin-path=/usr/lib/mozilla/plugins/libflashplayer.so --lang=en-US --channel=2794.1330.1990362572


$ ps f -opid,cmd -Cchromium | awk '$2 !~ /^[|\\]/ { print $1 }'
PID
2800
2794

$ # also supressing the header of ps (top line 'PID') -- add 'h' to ps
$ ps hf -opid,cmd -Cchromium | awk '$2 !~ /^[|\\]/ { print $1 }'
2800
2794
于 2012-09-11T15:48:34.827 に答える
1

別の解決策(ここから):

ps -ocommand= -p $PPID | awk -F/ '{print $NF}' | awk '{print $1}'
于 2014-04-04T10:12:04.453 に答える
0

--pidfile オプションでマスターの pid を単純にファイル (pidfile) に保存してみませんか? 実行可能な解決策でない場合は、 --procname-master を使用してマスター プロセスにカスタム名を付けることができます。

そのようなことに ps を使用することは非常に信頼性が低いです (あらゆる場所での競合状態、および解析規則を無効にする特殊なケース...)

于 2012-09-11T17:45:46.987 に答える
0

プロセスのマスター プロセス ID を取得するのは別の解決策です。

pstree -p 1 |grep <proc_name>|sed -n 1p|tr -d "|,-"|sed 's/(/ /g'|sed 's/)/ /g'|tr -d "+"|awk {'print $2'};
于 2016-06-15T11:45:16.670 に答える
-1

キーワードから KEYWORD

ps aux | grep -i KEYWORD | grep -v grep | awk '{print $2}'|sort -h|head -1|xargs kill

ところで、親プロセスIDが有効な最小IDであるというこの仮定はありますか??

于 2015-09-11T06:29:05.783 に答える