그래서 백그라운드에서 실행되는 영구 프로그램이 있습니다. 이를 죽이면 다른 PID로 다시 시작됩니다. 일시정지하고 싶습니다(실제로 죽이지 않고 절전 모드로 설정). Kill-9이 이것을 할 수 있습니까? 그렇지 않다면 어떻게 해야 합니까?
답변1
kill -STOP $PID
[...]
kill -CONT $PID
@조던추가됨: like SIGKILL
( kill -9
동일함) 및 SIGSTOP
can을 참고하세요.아니요무시당하다.
답변2
(중복되거나 종료된 질문에도 답변하세요.실행 중인 프로세스를 일시 중지하거나 정지하는 방법은 무엇입니까?, 복구 후 앱이 충돌하는 경우 어떻게 해야 하는지 묻습니다. )
kill -STOP $PID
& 이후 일부 프로세스가 올바르게 재개되지 않습니다 kill -CONT $PID
. 이 경우 체크포인트/복원을 시도해 볼 수 있습니다.크리우. 오버헤드가 마음에 들지 않으면 가상 머신에서 프로세스를 실행하고 일시 중단할 수도 있습니다.
SIGSTOP
프로세스가 이후에 재개될 수 없는 이유 중 하나는 프로세스가 중지되었다가 재개될 때 Linux의 특정 차단 시스템 호출이 실패하기 SIGCONT
때문일 수 있습니다 . ~에서EINTR
SIGCONT
신호(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