タイトルが示すように、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のバージョンによってはシステムがスキャン用のすべての引数リストを簡単に提供できるわけではありません。
答え2
pgrep firefox
Ubuntu 20.04で動作しない理由
これはエラーだからです。 https://bugzilla.mozilla.org/show_bug.cgi?id=1649010。
解決策は次のとおりです。
pgrep "firefox|MainThread"
これがうまくいくのはなぜですか?
MainThread
UbuntuでFirefox 79が実行されているときに値を書き込みます/proc/<pid>/comm
(上記のコメント/質問セクションでこれを指摘した@steeldriverに感謝します)。pgrep
次に、from値を使用して/proc/<pid>/comm
コマンドに一致する項目を見つけます。- パイプ
|
区切り記号を使用すると、複数のpgrep
値を一致させることができます。firefox
このコマンドが以前のバージョン(Ubuntu 18.04 + Firefox 78など)で引き続き成功し、以前のバージョンでも正しく機能するようにANDを維持することをお勧めします。MainThread
pgrep 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