Câu trả lời:
kill -STOP $PID
[...]
kill -CONT $PID
@jordanm cho biết thêm: Cũng lưu ý rằng giống như SIGKILL ( kill -9
), không thể bỏ qua SIGSTOP .
(Ngoài ra để trả lời trùng lặp / câu hỏi khép kín Làm thế nào tôi có thể tạm dừng hoặc đóng băng một quá trình chạy? , Hỏi về những việc cần làm khi ứng dụng sụp đổ sau khi tiếp tục.)
Có những quy trình không tiếp tục đúng sau kill -STOP $PID
& kill -CONT $PID
. Nếu đó là trường hợp bạn có thể thử điểm kiểm tra / khôi phục với CRIU . Nếu bạn không quan tâm đến chi phí hoạt động, bạn cũng có thể chạy quy trình trong một máy ảo mà bạn có thể tạm dừng.
Một lý do tại sao một quá trình không tiếp tục sau SIGSTOP / SIGCONT có thể là do một số cuộc gọi hệ thống chặn trên Linux không thành công với EINTR khi quá trình bị dừng và sau đó được tiếp tục lại thông qua SIGCONT. Từ tín hiệu (7) :
Ngắt các cuộc gọi hệ thống và chức năng thư viện bằng tín hiệu dừng
Trên Linux, ngay cả khi không có bộ xử lý tín hiệu, một số giao diện chặn nhất định có thể không thành công với lỗi EINTR sau khi quá trình bị dừng bởi một trong các tín hiệu dừng và sau đó được tiếp tục lại thông qua SIGCONT. Hành vi này không bị POSIX.1 xử phạt và không xảy ra trên các hệ thống khác.
[...]
Một trong những cuộc gọi hệ thống bị ảnh hưởng là epoll_wait (2) . Thí dụ:
#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;
}
Biên dịch và chạy:
$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+ Stopped ./example
$ fg
./example
epoll_wait: Interrupted system call
EINTR
khi SIGCONT
được gửi đến quá trình dừng. Chương trình vẫn dừng cho đến khi SIGCONT
được gửi
Bạn có thể sử dụng pkill để gửi STOP
và CONT
tín hiệu cho tên quá trình, do đó bạn không cần phải tìm hiểu về PID.
Để tạm dừng một quá trình theo tên:
pkill --signal STOP ProcessNameToSuspend
Để đánh thức quá trình đó trở lại:
pkill --signal CONT ProcessNameToSuspend