Відповіді:
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