Odpowiedzi:
kill -STOP $PID
[...]
kill -CONT $PID
@jordanm dodaje: Należy również pamiętać, że podobnie jak SIGKILL ( kill -9
), SIGSTOP nie można zignorować.
(Również, aby odpowiedzieć na pytanie powielone / zamknięte. Jak mogę zatrzymać lub zawiesić uruchomiony proces?, Pytając o to, co zrobić, gdy aplikacje ulegną awarii po wznowieniu.)
Istnieją procesy, które nie są wznawiane poprawnie po kill -STOP $PID
& kill -CONT $PID
. W takim przypadku możesz spróbować sprawdzić / przywrócić za pomocą CRIU . Jeśli nie przeszkadza ci narzut, możesz również uruchomić proces na maszynie wirtualnej, którą możesz zawiesić.
Jednym z powodów, dla których proces nie jest wznawiany po SIGSTOP / SIGCONT, może być to, że niektóre blokujące wywołania systemowe w Linuksie nie działają z EINTR, gdy proces jest zatrzymywany, a następnie wznawiany przez SIGCONT. Z sygnału (7) :
Przerwanie wywołań systemowych i funkcji bibliotecznych przez sygnały stop
W systemie Linux, nawet przy braku programów obsługi sygnałów, niektóre interfejsy blokujące mogą zawieść z błędem EINTR po zatrzymaniu procesu przez jeden z sygnałów zatrzymania, a następnie wznowieniu za pośrednictwem SIGCONT. To zachowanie nie jest sankcjonowane przez POSIX.1 i nie występuje w innych systemach.
[...]
Jednym z wywoływanych wywołań systemowych jest epoll_wait (2) . Przykład:
#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;
}
Skompiluj i uruchom:
$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+ Stopped ./example
$ fg
./example
epoll_wait: Interrupted system call
EINTR
po SIGCONT
wysłaniu do zatrzymanego procesu. Program pozostaje zatrzymany, dopóki nie SIGCONT
zostanie wysłany
Możesz użyć pkill, aby wysłać sygnały STOP
i CONT
do nazw procesów, abyś nie musiał szukać PID.
Aby zawiesić proces według nazwy:
pkill --signal STOP ProcessNameToSuspend
Aby obudzić ten proces z powrotem:
pkill --signal CONT ProcessNameToSuspend