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


11

그래서 백그라운드에서 지속적인 프로그램을 실행하고 있습니다. 종료하면 다른 PID로 다시 시작됩니다. 나는 그것을 일시 중단하고 싶습니다 (실제로 죽이지 않고 잠들게하십시오). -9를 죽입니까? 그렇지 않다면 어떻게해야합니까?

답변:


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

@jordanm은 다음과 같이 덧붙입니다. SIGKILL ( kill -9) 과 같이 SIGSTOP 도 무시할 수 없습니다 .


4

(중복 된 / 닫힌 질문에 대답하려면 실행중인 프로세스를 일시 중지하거나 중지 하려면 어떻게해야 합니까?) , 재개 후 응용 프로그램 충돌시 어떻게해야하는지 묻습니다.

kill -STOP $PID& 다음에 제대로 재개되지 않는 프로세스가 있습니다 kill -CONT $PID. 이 경우 CRIU로 검사 점 / 복원을 시도 할 수 있습니다 . 오버 헤드가 마음에 들지 않으면 일시 중단 할 수있는 가상 시스템에서 프로세스를 실행할 수도 있습니다.

SIGSTOP / SIGCONT 이후 프로세스가 재개되지 않는 한 가지 이유는 프로세스가 중지 된 후 SIGCONT를 통해 재개 될 때 Linux에서 일부 차단 시스템 호출이 EINTR과 함께 실패하기 때문입니다. 가입일 신호 (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

흥미 롭군 예를 들어 주시겠습니까?
roaima

> 그런 다음 SIGCONT <를 통해 다시 시작 합니다. 중지 된 프로세스로 전송 되면 시스템 호출이 수신된다는 메시지가 EINTR나타납니다 SIGCONT. 프로그램 SIGCONT은 전송 될 때까지 중지 된 상태로
유지됨

0

pkill 을 사용 하여 STOPCONT신호를 프로세스 이름 으로 보내 PID를 찾을 필요가 없습니다.

이름으로 프로세스를 일시 중지하려면 다음을 수행하십시오.

 pkill --signal STOP ProcessNameToSuspend

해당 프로세스를 다시 시작하려면 :

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