리눅스에서 프로세스를 일시적으로 정지시킬 수 있습니까?


53

일정 시간 동안 프로세스를 고정시키는 방법이 있는지 궁금합니다.

내 말은 의미 : 한 응용 프로그램 (아마도 루트로 실행 중)이 이미 실행중인 다른 프로세스 (GUI 및 명령 줄 프로세스)의 실행을 일시 중지 한 다음 나중에 다시 시작할 수 있습니까? 다시 말해서 나는 일정 시간 동안 리눅스 스케줄러가 특정 프로세스를 예약하고 싶지 않다.

답변:


81

여기를 참조 하십시오

프로세스 실행을 중단 할 수 있는 두 가지 신호가 있습니다. 하나는 "우아한"이고 다른 하나는 "강한"입니다.

"우아한"것은 SIGTSTP, 그리고 그것의 목적은 프로세스가 마음에 들었다면, 그것을받을 때까지 실행을 일시 중지하기 위해 "멋지게"물어 보는 것 SIGCONT입니다. 의 경우 SIGTSTP프로세스는 SIGTSTP를 무시하고 어쨌든 계속 실행할 수 있으므로 SIGTSTP를 처리하도록 설계된 프로그램의 협력이 필요합니다.

"강력한"것은입니다 SIGSTOP. 그리고 그 목적은 해당 프로세스와 관련된 모든 사용자 공간 스레드를 일시 중단하는 것입니다. 과정을 무시하는 것은 그냥 불가능 SIGSTOP은 무시하는 것이 그대로 SIGKILL(후자는 강제로 프로세스를 종료).

이 같은 프로그램을 사용할 수 있습니다, 여기에 언급 된 사람의를 포함하여, 임의의 신호를 보내려면 kill, killall, 또는 pkill; 또는 시스템 호출을 사용하십시오 kill(2). 플랫폼 / 아키텍처 / 버전 별 세부 사항 및 위의 내용에 대한 정오표는 운영 체제 맨 페이지를 참조하십시오. 이러한 모든 명령과 syscall에서 "kill"이라는 단어는 잘못된 이름입니다. 이 명령은 독점적으로 프로세스를 종료하도록 설계 되지 않았습니다 . 그들은 특정 신호를 보내서 그렇게 할 수 있습니다 . 그러나 신호는 프로세스 종료 이외의 기능에도 사용될 수 있습니다. 예를 들어 SIGSTOP프로세스 만 일시 중단되며이 방법으로 보낼 수있는 여러 신호 중 하나 일뿐입니다.

자동으로 일정 기간이 경과 한 후 프로세스를 재개의 조건을 추가하려면 계속 실행 한 후 다시 호출하는 모니터링 프로세스, 일어나하기 위해 타이머를 설정 모니터링 프로세스의 일종 사용할 필요가 kill(2)다시를 SIGCONT커널에게 실행 재개를 요청하기 위해 중지 된 프로세스로 신호를 보냅니다 . 리눅스에는 다양한 정확도와 정밀도를 가진 여러 타이밍 메커니즘이 있습니다. 또한 시스템 사용량이 많으면 타이머가 만료 된 후에도 모니터링 프로세스가 깨어나지 않아 깨우기가 지연 될 수 있습니다.

일시 중단 된 프로세스의 일시 중단 및 재개 정밀도가 매우 정확한 경우 실시간 권한으로 모니터링 프로그램을 실행해야 할 수 있습니다 ( 프로세스를 실시간으로 만드는 방법 에 대한 자세한 내용 은 이 맨 페이지 참조 sched_setscheduler(2)). 또한 실시간 스케줄링과 함께 Linux 커널의 기능 (하드웨어에서 지원하는 경우에만 사용 가능) 인 High-Resolution Timers를 사용 하여 타이밍에서 매우 정확하고 밀리 초 미만의 정밀도 를 얻을 수 있습니다. 모니터 된 프로세스를 매우 빠르게 재개하기 위해 깨우기 및 신호 전송.

이 기술을 구현하기 위해 어떤 기술을 사용할 것인지는 밝히지 않았습니다. 최소한 bash 스크립팅이 필요하지만, 그런 식으로 아주 세밀한 타이밍을 얻을 수는 없습니다. 다음은 쿼리 개념의 증거인 bash "스크립트"입니다 (추천하지 마십시오). 정확한 타이밍이 필요한 경우 C / C ++ 또는 다른 모국어로 프로그램을 작성하고 실시간 예약 및 시간제를 사용해야합니다.

#!/bin/bash
#This is the process you want to suspend.
screen -mdS child bash -c "cat /dev/urandom | base64"
#This is the process ID of the child process
THEPID=$(screen -list | grep child | cut -f1 -d'.' | sed 's/\W//g')
#Send SIGSTOP to the child process.
kill -SIGSTOP ${THEPID}
#Now it is suspended. This process will sleep for 10 seconds asynchronously, then resume the process.
screen -mdS monitor bash -c "sleep 10; kill -SIGCONT ${THEPID}"

스크립트가 종료되고 제어 스크립트가 종료되지만 screen모니터 프로세스 제어 로 인해 10 초 동안 백그라운드에서 계속 실행되고 (에 전달 된 인수에 따라 sleep) 깨어나서 하위 프로세스가 계속됩니다. 그러나 이것은 제어 스크립트가 종료 된 후 얼마되지 않을 것입니다. 시간이 경과 할 때까지 동 기적으로 대기하려면 두 번째 호출을 생략 screen하고 절전 모드를 하드 코딩 한 후 제어 스크립트를 종료하십시오.

다음을 실행하여 프로세스가 실제로 일시 중단되는지 테스트 할 수 있습니다.

screen -rS child

이 스크립트를 시작한 후 콘솔에 아무것도 표시되지 않습니다. 그런 다음 타이머가 만료 된 후 (10 초) base64 데이터 (0-9 및 AF의 임의 문자)로 화면이 넘치게됩니다. 종료하려면 Ctrl + C를 누르십시오.


PoC bash 스 니펫을 포함한 매우 완벽한 답변. 좋은!
fgysin

TCP 연결과 같은 네트워크 세션 중간에 프로세스가 정지 된 경우 계속 진행될 때 해당 네트워크 세션이 손상되거나 삭제 될 수 있습니까? 이에 대해 정의 된 동작이 있습니까?
CMCDragonkai

@cmcdragonkai는 실행 중 프로세스가 중지되어 fd에서 읽거나 쓸 수 없기 때문에 TCP 세션에서 버퍼가 가득 찰 때까지 바이트를 계속 전송합니다. 즉, 커널 공간과 사용자 공간 사이에 전송이 없습니다. 냉동 과정은 다른 확인 https://www.kernel.org/doc/Documentation/power/freezing-of-tasks.txt
Nizam Mohamed

프로세스를 다시 포 그라운드로 가져온 후 TCP 연결이 계속 될 수 있음을 발견했습니다 (시간 제한은 응용 프로그램에 따라 다르며 TCP keepalive도 있지만 응용 프로그램 수준 keepalive도 있습니다). 프로세스 중지는 컴퓨터가 최대 절전 모드 또는 절전 모드 인 경우를 의미합니다. 맞습니까?
CMCDragonkai

이 스크립트는 더 비 협력적인 코드에 적용하지 않는다 gist.github.com/ceremcem/864dd94b52ffe7b18da29558df4f1f5b
ceremcem

14

예, 중지 신호를 프로세스 에 전송하여 중지 하고 CONT 를 계속 하면이를 수행 할 수 있습니다 .

용법:

kill -STOP <pid>

kill -CONT <pid>

11

"동결"의 정의가 적절하지 않으면 renice명령을 확인하십시오 .

Renice를 사용하면 실행중인 프로세스의 스케줄링 우선 순위를 변경할 수 있습니다.

일반적인 프로세스 nice 값은 0입니다. nice 값을 늘리면 "먼저 가지 않는 이유"와 같이 프로세스가 더 좋아집니다. nice 값을 줄이면 프로세스가 덜 좋아 지지만 "나의 길에서 벗어나십시오. 나는 서두르고 있습니다." 좋은 값 범위는 -20에서 19입니다.

누구나 자신의 프로세스를 더 멋지게 만들 수 있습니다. 루트 만이 프로세스를 덜 멋지게 만들거나 다른 사용자 프로세스를 멋지게 변경할 수 있습니다.

프로세스 nice 값을 19로 설정하면 시스템의 다른 어떤 것도 원하지 않는 경우에만 실행됩니다.

다음은 로컬 리눅스 박스에서 실행되는 예제입니다.

ps -lNI 컬럼을 사용 하고 살펴보면 프로세스의 가치를 알 수 있습니다.

-> ps -l
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY CMD
0 S 29190402 31146 75 75-16547 대기 pts / 0 배쉬
0 T 29190 1105 402 75-23980 마감 pts / 0 vim
0 R 29190794402 076 0-15874-pts / 0 ps

실행 renice +10Vim은 프로세스 것은 낮은 우선 순위로 실행됩니다.

-> renice +10 -p 1105
1105 : 이전 우선 순위 0, 새로운 우선 순위 10

-> ps -l
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY CMD
0 S 29190402 31146 0 76 0-16547 대기 pts / 0 배쉬
0 T 29190 110540295 95 10-23980 마감 pts / 0 vim
0 R 29190 1998 402 078 15874-pts / 0 ps

"고정"을 늘려 "시스템의 다른 사람을 방해하지 않음"을 의미한다고 가정하면 다음과 같은 스크립트를 작성할 수 있습니다.

renice 20 -p <관심의 대상>
수면 <특정 시간>
renice 0 -p <관심있는 대상>

(루트로 실행해야 함).


ps -l작은 파란색 상자에 흥미로운 열이 멋지게 표시되도록 위의 출력으로 자유 를 얻었습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.