Відповіді:
kill -STOP $PID
[...]
kill -CONT $PID
@jordanm додає: Також зауважте, що як і SIGKILL ( kill -9
), SIGSTOP не можна ігнорувати.
(Також щоб відповісти на повторне / закрите запитання. Як я можу призупинити або заморозити запущений процес ? , запитуючи про те, що робити, коли програми завершуються аварійно після відновлення.)
Є процеси, які не відновляються належним чином після kill -STOP $PID
& kill -CONT $PID
. Якщо це так, ви можете спробувати контрольно-пропускний пункт / відновити за допомогою CRIU . Якщо ви не заперечуєте проти накладних витрат, ви також можете запустити процес у віртуальній машині, яку ви можете призупинити.
Однією з причин того, що процес не поновлюється після SIGSTOP / SIGCONT, може бути те, що деякі блокуючі системні виклики в Linux виходять з ладу з EINTR, коли процес зупиняється та відновлюється через SIGCONT. З сигналу (7) :
Переривання системних викликів та функцій бібліотеки стоп-сигналами
У Linux, навіть за відсутності обробників сигналів, певні блокуючі інтерфейси можуть вийти з ладу EINTR з помилкою після того, як процес зупиняється одним із зупиняючих сигналів і потім поновлюється через SIGCONT. Така поведінка не санкціонується 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
EINTR
коли він SIGCONT
надсилається до зупиненого процесу. Програма залишається зупиненою, поки не SIGCONT
буде надіслано
Ви можете використовувати pkill для надсилання STOP
і CONT
сигналів для імен процесів, так що вам не потрібно буде дізнаватися PID.
Щоб призупинити процес на ім'я:
pkill --signal STOP ProcessNameToSuspend
Щоб пробудити резервне копіювання цього процесу:
pkill --signal CONT ProcessNameToSuspend