프로세스를 종료하지 않고 일시 중단

프로세스를 종료하지 않고 일시 중단

그래서 백그라운드에서 실행되는 영구 프로그램이 있습니다. 이를 죽이면 다른 PID로 다시 시작됩니다. 일시정지하고 싶습니다(실제로 죽이지 않고 절전 모드로 설정). Kill-9이 이것을 할 수 있습니까? 그렇지 않다면 어떻게 해야 합니까?

답변1

kill -STOP $PID
[...]
kill -CONT $PID

@조던추가됨: like SIGKILL( kill -9동일함) 및 SIGSTOPcan을 참고하세요.아니요무시당하다.

답변2

(중복되거나 종료된 질문에도 답변하세요.실행 중인 프로세스를 일시 중지하거나 정지하는 방법은 무엇입니까?, 복구 후 앱이 충돌하는 경우 어떻게 해야 하는지 묻습니다. )

kill -STOP $PID& 이후 일부 프로세스가 올바르게 재개되지 않습니다 kill -CONT $PID. 이 경우 체크포인트/복원을 시도해 볼 수 있습니다.크리우. 오버헤드가 마음에 들지 않으면 가상 머신에서 프로세스를 실행하고 일시 중단할 수도 있습니다.

SIGSTOP프로세스가 이후에 재개될 수 없는 이유 중 하나는 프로세스가 중지되었다가 재개될 때 Linux의 특정 차단 시스템 호출이 실패하기 SIGCONT때문일 수 있습니다 . ~에서EINTRSIGCONT신호(7):

정지 신호를 통해 시스템 호출 및 라이브러리 기능 중단

Linux에서는 신호 처리기가 없어도 프로세스가 중지 신호 중 하나로 중지된 후 SIGCONT를 통해 재개된 후 EINTR 오류로 인해 일부 차단 인터페이스가 실패할 수 있습니다. 이 동작은 POSIX.1에서는 인식되지 않으며 다른 시스템에서는 발생하지 않습니다.

[...]

영향을 받는 시스템 호출 중 하나는 다음과 같습니다.epoll_wait(2). 예:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <sys/epoll.h>

int
main(int argc, char *argv[])
{
    int fd = 0;

    int efd = epoll_create(1);
    if (efd == -1) {
        perror("epoll_create");
        exit(1);
    }

    struct epoll_event ev;
    memset(&ev, 0, sizeof(ev));
    ev.events = EPOLLIN;
    ev.data.fd = fd;

    if (epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev) == -1) {
        perror("epoll_ctl");
        exit(1);
    }

    int res = epoll_wait(efd, &ev, 1, -1);
    if (res == -1) {
        perror("epoll_wait");
        exit(1);
    }

    if (ev.events & EPOLLIN && ev.data.fd == fd) {
        printf("Received input\n");
    }

    return 0;
}

컴파일하고 실행합니다:

$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+  Stopped                 ./example
$ fg
./example
epoll_wait: Interrupted system call

답변3

당신은 그것을 사용할 수 있습니다삭제보내고STOPCONT PID를 찾을 필요가 없도록 프로세스 이름에 신호를 보냅니다.

이름으로 프로세스를 일시 중지합니다.

 pkill --signal STOP ProcessNameToSuspend

프로세스를 깨우려면:

 pkill --signal CONT ProcessNameToSuspend

표준 시스템에서는 다른 모든 명령 요소와 함께 TAB-completion을 사용할 수 있습니다 .ProcessName

관련 정보