タイトルが示すように、Ubuntu 20.04で次のコマンドを実行します.
pgrep firefox
...結果は返されませんでした。
同時に、次のコマンドを実行します。
ps aux |grep firefox
... 6つの結果を返し、そのうち5つは一致する必要がありますpgrep firefox
。pgrep
Ubuntuの元のコマンドにはどのような問題がありますか?
ubuntu 81646 1.9 7.9 3063696 300208 ? Sl 13:12 0:29 /usr/lib/firefox/firefox -new-window
ubuntu 81891 0.2 3.8 2473448 144796 ? Sl 13:12 0:03 /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 222536 -parentBuildID 20200720193547 -appdir /usr/lib/firefox/browser 81646 true tab
ubuntu 82020 0.1 3.7 2438972 141396 ? Sl 13:12 0:02 /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 897 -prefMapSize 222536 -parentBuildID 20200720193547 -appdir /usr/lib/firefox/browser 81646 true tab
ubuntu 82051 0.0 2.8 2401248 107520 ? Sl 13:12 0:01 /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 6935 -prefMapSize 222536 -parentBuildID 20200720193547 -appdir /usr/lib/firefox/browser 81646 true tab
ubuntu 83658 0.0 2.0 2387704 78496 ? Sl 13:12 0:00 /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 10362 -prefMapSize 222536 -parentBuildID 20200720193547 -appdir /usr/lib/firefox/browser 81646 true tab
ubuntu 90700 0.0 0.0 17664 664 pts/0 S+ 13:37 0:00 grep --color=auto firefox
同じコマンドを実行すると、Ubuntu 18.04とmacOSで正常に動作します。
ベストアンサー1
pgrep
ps
なしで報告されたプロセス名と一致し、in-f
や非標準pgrep -f
などのパラメータのリストと一致します。ps -f
ps aux
firefox
スレッド名を変更して、各スレッドが実行するアクションを識別します。
試してみてください(デフォルトと仮定$IFS
):
ps -L -o comm= -p $(pgrep -wf firefox)
どのリスト名前パラメーターのリストを含むプロセス内のすべてのスレッドには、firefox
次のような内容がたくさん表示されます。
MainThread
gmain
gdbus
Gecko_IOThread
Timer
Netlink Monitor
Socket Thread
Permission
JS Watchdog
JS Helper
[...]
そのため、プロセス/スレッド名の代わりに引数firefox
リスト(対応するスレッドまたは親スレッドが実行した最後のコマンドの引数リスト)で一致pgrep -f firefox
(すべてのスレッドを一覧表示するには追加)できます。-w
または、pgrep -f '^[^ ]*firefox'
引数リストの最初の単語のみを一致させます(pgrep
inのように一致する前に、引数をスペースで連結してくださいps -f
)。
いずれにせよ、すべてのプロセスはプロセス名またはパラメータリストを必要に応じて設定または変更できるため、この方法でプロセスを見つけることは決して簡単ではありません。
/usr/lib/firefox/firefox
現在実行可能ファイルを実行しているプロセスと一致させるには、Linuxで次のものを使用しますzsh
。
print -rC1 /proc/<1->/exe(Ne['[[ $REPLY -ef /usr/lib/firefox/firefox ]]']:h:t)
またはスレッドの場合:
print -rC1 /proc/<1->/task/*/exe(Ne['[[ $REPLY -ef /usr/lib/firefox/firefox ]]']:h:t)
(スーパーユーザー権限がないと、自分のように実行されていないプロセスに関する情報を取得できない可能性があります。)
または少し移植性に優れている可能性がありますlsof
。
lsof -Fd /usr/lib/firefox/firefox | sed '/^p/h;/^ftxt/!d;g;s/^p//'
またはスレッドの場合:
lsof -K -FKd /usr/lib/firefox/firefox | sed '/^K/h;/^ftxt/!d;g;s/^K//'
1プロセス名の長さは通常制限されています(Linuxの場合は15バイト)、OSおよびOSのバージョンによってはシステムがスキャン用のすべての引数リストを簡単に提供できるわけではありません。