Ubuntu 20.04で「pgrep firefox」が機能しない理由

Ubuntu 20.04で「pgrep firefox」が機能しない理由

タイトルが示すように、Ubuntu 20.04で次のコマンドを実行します.

pgrep firefox

...結果は返されませんでした。

同時に、次のコマンドを実行します。

ps aux |grep firefox

... 6つの結果を返し、そのうち5つは一致する必要がありますpgrep firefoxpgrepUbuntuの元のコマンドにはどのような問題がありますか?

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

pgreppsなしで報告されたプロセス名と一致し、in-fや非標準pgrep -fなどのパラメータのリストと一致します。ps -fps 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'引数リストの最初の単語のみを一致させます(pgrepinのように一致する前に、引数をスペースで連結してください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のバージョンによってはシステムがスキャン用のすべての引数リストを簡単に提供できるわけではありません。

答え2

pgrep firefoxUbuntu 20.04で動作しない理由

これはエラーだからです。 https://bugzilla.mozilla.org/show_bug.cgi?id=1649010

解決策は次のとおりです。

pgrep "firefox|MainThread"

これがうまくいくのはなぜですか?

  • MainThreadUbuntuでFirefox 79が実行されているときに値を書き込みます/proc/<pid>/comm(上記のコメント/質問セクションでこれを指摘した@steeldriverに感謝します)。
  • pgrep次に、from値を使用して/proc/<pid>/commコマンドに一致する項目を見つけます。
  • パイプ|区切り記号を使用すると、複数のpgrep値を一致させることができます。firefoxこのコマンドが以前のバージョン(Ubuntu 18.04 + Firefox 78など)で引き続き成功し、以前のバージョンでも正しく機能するようにANDを維持することをお勧めします。MainThreadpgrep firefox

これが不正確である可能性があるのはなぜですか?

  • 警告する:Firefox以外のプロセス名を持つすべてのプロセスも、このテクノロジを使用して実行されていると報告されてMainThreadいます。注意して使用してください。
  • 警告する:複数のプロセスがアクティブになる可能性があります。理由については、この回答をご覧ください。https://unix.stackexchange.com/a/607242/190347
  • ノートpgrep -x "firefox|MainThread":正確なマッチングをお勧めします。

他のオプションは何ですか?

  • @steeldriverが指摘したように、これがpgrep -f firefox適切な代替品であると推論できます。その中に含まれているコマンド(ディレクトリ名、ファイル名など)MainThreadと一致する可能性があるため、同様の運命に遭遇します。firefoxこのため、文字列よりも悪意のあるプロセスと一致する可能性が高く、したがって偽の肯定が発生する可能性が高いことがわかりましたMainThread。これは文書化された証拠のない経験に基づく直感ですが、GitHubですばやく検索してみると、MainThread一般的なプロジェクト名ではないことがわかります(58件の結果、相対的firefox一致する21,000のストレージ)
  • あるいは、コマンド/テクノロジの組み合わせを使用して偽の肯定をフィルタリングすることは、他のすべての方法よりも優れている可能性があります(たとえば、2つのコマンドの結果の和集合の検索)。
  • 頼む。なぜこれが起こったのかMozillaに直接尋ねた後、私たちはバグについて学びました。https://bugzilla.mozilla.org/show_bug.cgi?id=1662232

関連情報