Ubuntu 20.04에서 "pgrep firefox"가 작동하지 않는 이유

Ubuntu 20.04에서 "pgrep firefox"가 작동하지 않는 이유

제목에서 알 수 있듯이 Ubuntu 20.04에서 다음 명령을 실행하십시오.

pgrep firefox

...결과가 반환되지 않았습니다.

동시에 다음 명령을 실행합니다.

ps aux |grep firefox

...6개의 결과를 반환하며 그 중 5개는 일치해야 합니다 pgrep firefox. pgrepUbuntu의 원래 명령에 어떤 문제가 있습니까?

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없이 보고된 프로세스 이름과 일치하고 -fin 또는 비표준 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개의 저장소)
  • 또는 명령/기술의 조합을 사용하여 거짓 긍정을 필터링하는 것이 다른 모든 방법(예: 두 명령 결과의 합집합 찾기)보다 나을 수 있습니다.
  • 묻다. 왜 이런 일이 발생했는지 Mozilla에게 직접 물어본 후 우리는 버그에 대해 알게 되었습니다.https://bugzilla.mozilla.org/show_bug.cgi?id=1662232

관련 정보