Linux 시스템에서 실행중인 프로세스를 일시 중지하고 나중에 다시 시작할 수있는 방법이 있습니까?


37

컴퓨터에서 파일을 복사해야합니다. 그리고 데이터는 엄청나게 큽니다. 이제 서버는 정상적으로 서비스를 제공해야하며 일반적으로 서버에 특정 범위의 바쁜 시간이 있습니다. 서버가 바쁜 시간에 도달하면 프로세스를 일시 중지하고 해당 범위를 벗어나면 다시 시작하는 방식으로 이러한 명령을 실행하는 방법이 있습니까?

의도 된 결과

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.

22
rsync는 부분 전송을 재개 할 수 있습니다
Thorbjørn Ravn Andersen

2
당신이 할 필요가 백업으로 복사 할 실제 데이터를? 그렇지 않은 경우 cp -al하드 링크 팜을 만드는 데 사용할 수 있습니까? 또는 cp -a --reflink=auto? BTRFS 및 ZFS는 동일한 물리적 장치 내에서 사본을 지원합니다.
Peter Cordes

9
src9:00에서 14:00 사이 에 변경 되는 파일이 있습니까? 그렇다면 cp프로세스 를 일시 중지했다가 다시 시작하면 파일이 손상 될 수 있습니다. 명령 rsync과 함께 실행하는 것이 좋습니다 timeout.
Mark Plotnick

파일이 어디에서 복사되고 있습니까? 이것이 가상 시스템입니까? 소스 파일 시스템은 무엇입니까? 사본의 목적은 무엇입니까?
Braiam

@Braiam Im은 rsync를 사용하고 원격에서 로컬 컴퓨터로 파일을 복사합니다. 방금 cp 명령을 예로 사용했습니다. btw
Sollosa

답변:


7

예, 당신은

acquire the process id of the process-to-paus (PS), then do
$> kill -SIGSTOP <pid>

그러면 프로세스는 상태 "T"(PS)로 표시됩니다. 계속하려면

$> kill -CONT <pid>

행운을 빕니다!


77

SIGSTOP 신호를 보내 프로세스 실행을 일시 중지 한 다음 나중에 SIGCONT를 보내 프로세스를 다시 시작할 수 있습니다.

워크로드가 단일 프로세스라고 가정하면 (백그라운드에서 실행중인 도우미는 포크하지 않음) 다음과 같이 사용할 수 있습니다.

# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid

그런 다음 바쁜 시간이 시작되면 SIGSTOP을 보내십시오.

# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"

나중에 서버가 다시 유휴 상태가되면 다시 시작하십시오.

# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"

실행을 원하는 특정 시간에 대해 일정을 예약해야합니다. cron 또는 시스템 타이머와 같은 도구 (또는 다양한 기타 도구)를 사용하여이를 예약 할 수 있습니다. 시간 간격을 기준으로 스케줄링하는 대신 서버를 모니터하여 (부하 평균, CPU 사용량 또는 서버 로그의 활동을보고) 사본 일시 정지 / 재개시기를 결정할 수 있습니다.

또한 PID 파일을 관리해야합니다 (사용하는 경우). 복사하기 전에 실제로 실제로 실행 중인지 확인하십시오. 복사가 완료되면 pidfile을 제거하여 정리하고 싶을 것입니다.

다시 말해, 신뢰성을 높이려면이 주변에 더 많은 것이 필요하지만, 이러한 SIGSTOP 및 SIGCONT 신호를 사용하여 프로세스 실행을 일시 중지 / 재개하는 기본 아이디어는 원하는 것 같습니다.



1
'/var/run/bigcopy.pid'가 여전히 생각하는 것과 동일한 프로세스를 참조한다는 것을 매우 조심해야한다는 것을 상기 시키십시오. 시스템에서 다른 프로세스를 임의로 중지하는 것은 바람직하지 않습니다. 나는 pid가 당신이 생각하는 프로그램을 참조 할 수있는 안전한 방법을 모른다 ...
Evan Benn

@EvanBenn 그래, 그 말은 "복사하기 전에 복사본을 실제로 실행하고 있는지 확인하십시오"라는 의미입니다.
그래도

@cat 실제로는 프로세스가 SIGSTOP을 차단할 수 없습니다. 첫 번째 코멘트의 링크를 참조하십시오 : "SIGSTOP은 SIGKILL과 같은 차단할 수없는 신호입니다."(또는 구글에서 볼 수 있습니다.)
filbranden

76

프로세스를 일시 중단하는 대신 우선 순위를 낮출 수도 있습니다.

renice 19 "$pid"

가장 낮은 우선 순위 (최고의 niceness)를 제공하므로 프로세스는 대부분의 시간이 필요한 다른 프로세스에 CPU를 제공합니다.

Linux에서 다음을 사용하여 I / O를 사용하여 동일한 작업을 수행 할 수 있습니다 ionice.

ionice -c idle -p "$pid"

프로세스가 "유휴"클래스에 배치되므로 다른 프로그램이 정의 된 유예 기간 동안 디스크 I / O를 요청하지 않은 경우에만 디스크 시간을 갖습니다 .


22
이것은 XY 문제 의 전형적인 경우입니다 . 문제는 프로세스를 일시 중지하는 방법이지만 질문에 대한 답변은 아닙니다. 실제로 우선 순위를 낮추는 것이 실제 문제에 대한 더 나은 접근 방법 이지만 질문에 대답하지는 않습니다. 나는 것이다 편집 도 프로세스를 일시 정지하고 문제가 될 수있는 일시 중지 이유 (예 : 파일을 일시 정지하는 동안 편집 할 수있는) 방법을 포함하도록 질문을.
MechMK1

22
@DavidStockinger는 기술적 으로이 답변 (OS, CPU, I / O 스케줄러)이 사용 중일 때 (한 번에 몇 초 동안이라도) 프로세스를 일시 중지하도록 OS에 지시하는 방법을 알려줍니다. 프로세스를 수동으로 일시 중단하는 방법은 이미 다른 답변에서 다루었습니다. 이 솔루션은 파일이 복사되는 동안 수정되는 문제를 해결하지 않습니다.
Stéphane Chazelas

5
I / O 우선 순위를 변경하는 것이 항상 최상의 솔루션은 아닙니다. 회전하는 디스크에서 복사하는 경우 우선 순위가 낮은 작업을 완전히 일시 중지 한 경우에는 발생하지 않는 우선 순위가 높은 각 요청 전에 계속 탐색이 발생할 수 있습니다.
마크

2
우선 순위가 낮더라도 문제가 해결되지 않습니다. 상자가 몇 초 또는 몇 분 동안 완전히 유휴 상태 인 경우에도 파일 시스템 캐시에서 모든 것을 제거하는 거대한 복사 프로세스가 방해가되지는 않습니다. 다시로드가 발생하자마자 모든 것을 다시 페이징하는 것이 매우 느려질 것입니다.
R ..

2
@DavidStockinger XY 문제를 처리하는 데 선호되는 방법은 질문이 요구하는 것이 아니더라도 올바른 솔루션 을 제공하는 것입니다. 질문에 설명 된 접근 방식이 잘못되었다는 것을 알면 좋은 대답은 잘못된 접근 방식을 제공하지 않고 대신 더 나은 접근 방식을 제안합니다.
terdon

8

이 시나리오에서는 rsync를 사용하고 cp를 잊어 버리십시오. 대역을 제한하는 매개 변수가 있거나 나중에 중단 될 수 있습니다 .Google rsync 예제를 남겼습니다.


3

실행중인 프로세스를 중단하여 수행하려는 경우 Screen 프로그램을 사용하는 것이 좋습니다. 한동안 리눅스를 사용하지는 않았지만 IIRC는 명령을 일시 중지하고 나중에 다시 시작하면 실수로 로그 오프하면 세션을 다시 시작할 수 없습니다.

화면을 통해 세션을 중단 한 다음 분리하고 로그 아웃 할 수 있다고 생각합니다. 나중에 다시 들어가서 해당 세션에 다시 연결할 수 있습니다. 약간만 사용해야하지만 세션이 훨씬 강력 해졌습니다.

또한 로그 아웃했다가 집에 가서 원격으로 로그인하고 사무실에서 시작한 시스템에 다시 연결 한 다음 저녁에 다시 시작한 다음 다음 날 직장에서 다시 선택할 수 있습니다.


이미 그쪽으로 tmux를 사용하고 있습니다. 그러나 나는 자각하거나 환경을 인식하는 스크립트를 작성하고 있으므로 서버가 트래픽을 많이 받으면 중지하고 정상일 때 계속합니다.
Sollosa

0

쉘이 지원하는 경우 (거의 모든 경우) ^ Z (Ctrl + Z)를 눌러 SIGTSTP신호를 쉽게 포 그라운드 작업에 보낸 다음 fg(포 그라운드에서) 또는 bg(배경에서) 계속할 수 있습니다.

여러 작업에서이 작업을 수행하고 나중에 다시 반환하려는 경우 jobscommand를 사용한 다음 with를 반환하면됩니다 fg/bg %#. 여기서 #은 작업의 대괄호 안에있는 숫자입니다.

명심 SIGTSTP보다 약간의 차이가 SIGSTOP가장 중요한 그것 때문에 무시 될 수 있다는 사실에 (다른 모든 대답에 사용) (그러나 프로그램이 다른 것보다 무시 나는 보지 않았다 sl). 이 답변에 대한 자세한 내용은 StackOverflow 에서 찾을 수 있습니다 .


아직 답변이없는 것에 놀랐습니다.
Ave

Ty Ave, 저는이 멀티 태스킹 트릭을 알고 있습니다. 그러나 그 일이 일어나려면 터미널에 있어야하지만 며칠이 걸리더라도 자체적으로 작업을 수행하는 스크립트를 작성해야했습니다.
Sollosa

@Sollosa 그것은 같은 질문을하고 터미널에 액세스 할 수있는 다른 사람들에게 유용 할 수 있습니다.
Ave

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