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