애플리케이션 일시 중지 및 재개

애플리케이션 일시 중지 및 재개

SIGSTOP및 신호를 보내 프로세스를 일시 중지하고 재개할 수 있습니다 SIGCONT.

Firefox를 예로 들어보겠습니다.

pkill --signal SIGSTOP firefox
pkill --signal SIGCONT firefox

사실 Firefox에는 , Web Content, 와 같은 일부 보조 프로세스도 있으며 계속 실행 WebExtensions됩니다 RDD Process.

애플리케이션에 속한 전체 프로세스 그룹을 일시 중지하고 일시 중지를 해제하는 방법이 있습니까?

답변1

이런 종류의 일에 대한 일반적인 대답은 프로세스에 신호를 보내야 한다는 것입니다.그룹그리고 과정뿐만이 아닙니다. 생성된 모든 프로세스는 firefox동일한 프로세스 그룹에 있어야 합니다. 실제로 내 시스템에서는 다음과 같습니다.

$ ps -aeo pgid,ppid,pid,s,comm,args | grep -E '[f]irefox|[P]PID'
   PGID    PPID     PID S COMMAND         COMMAND
   1095       1  151407 S firefox         /usr/lib/firefox/firefox
   1095  151407  151541 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151607 S WebExtensions   /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151689 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151711 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151738 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151765 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151802 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151876 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151889 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 9 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151928 S Privileged Cont /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab

따라서 일반적으로 실행 kill -19 -1095하면 프로세스 그룹의 모든 구성원이 정지됩니다 1095. 불행하게도 적어도 내 시스템에서는 이 그룹에 Firefox 이상의 내용이 포함되어 있습니다.

$ ps -aeo pgid,ppid,pid,s,comm,args | awk '$1==1095' | wc
    104    1382   29087

이 그룹에는 Xorg 또는 내 디스플레이 관리자 로그인과 같은 기본 도구를 포함하여 104개의 프로세스가 있습니다. 따라서 이는 Firefox를 일시 중지하기 때문에 기술적으로 작동하지만 전체 GUI도 일시 중지하여 시스템이 응답하지 않게 만듭니다.

따라서 다음 -f플래그를 사용할 수 있습니다 pkill.

-f, --완료

이 패턴은 일반적으로 프로세스 이름과만 일치합니다. -f를 설정하면 전체 명령줄이 사용됩니다.

지금 실행하면 pkill -f -19 firefox명령줄과 일치하는 모든 프로세스가 firefox일시 중지됩니다( S열 참조).

$ pkill -f -19 firefox
$ ps -aeo ppid,pid,s,comm,args | grep -E '[f]irefox|[P]PID'
   PGID    PPID     PID S COMMAND         COMMAND
   1095       1  151407 T firefox         /usr/lib/firefox/firefox
   1095  151407  151541 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151607 T WebExtensions   /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151689 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151711 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151738 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151765 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151802 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151876 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151889 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 9 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
   1095  151407  151928 T Privileged Cont /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab

물론 이는 firefoxManual텍스트 편집기나 기타 일치하는 프로세스에서 open이라는 이름의 텍스트 파일이 있는 경우 firefox해당 파일도 중단된다는 의미입니다.

또는 올바른 프로세스만 얻는다는 것을 100% 확신하려면 Firefox의 PID를 가져온 다음 Firefox와 이를 상위 ID로 사용하는 모든 프로세스에 신호를 보낼 수 있습니다.

pkill -19 firefox; pgrep -P $(pgrep firefox) | xargs kill -19

이를 함수로 바꿀 수도 있습니다:

myKill(){
    pkill "$1" "$2"; pgrep -P $(pgrep "$2") | xargs kill "$1"
}

이제 다음 방법으로 차단할 수 있습니다.

myKill -19 firefox

다시 시작하세요.

myKill -18 firefox

답변2

pkill이것은 사람에 따르면 "이름을 기반으로 신호 처리기를 찾거나 내보낼" 수 있는 훌륭한 도구입니다. 또한 여러 프로세스와 일치합니다. 모든 웹 콘텐츠와 웹 확장 프로그램이 동일한 파일 이름으로 실행되는 한 pkill -19 firefox-esr일시 중지를 최대한 많이 사용할 수 있습니다.모든 하위 프로세스.

어느 시점에서는 안전하지 않을 수 있습니다. Firefox의 특정 설치(그러나 모든 인스턴스)와 일치시키려는 경우 fuser다음 명령을 사용하여 PID(지정된 시스템 파일을 사용하는 프로세스 표시)를 쿼리할 수 있습니다. fuser /usr/lib/firefox-esr/firefox-esr | grep -Es "[0-9]+" | xargs kill -19(-18 복구) .

최종 결과는 | xargs ps프로세스 상태를 "Sl"(중단 가능한 절전 모드, 멀티 스레드)로 출력하는 연결을 사용하여 확인할 수 있습니다.

답변3

Linux가 cgroups v2 및 다음으로 업그레이드되었다고 가정합니다 ID=1000.

systemd-run --user --slice=firefox.slice firefox
# To freeze
echo 1 > /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/firefox.slice/cgroup.freeze
# To unfreeze
echo 0 > /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/firefox.slice/cgroup.freeze

관련 정보