Đình chỉ quá trình mà không giết nó


11

Vì vậy, tôi đã có một chương trình liên tục chạy trong nền. Giết nó chỉ khiến nó khởi động lại với một PID khác. Tôi muốn đình chỉ nó (đưa nó vào giấc ngủ mà không thực sự giết chết nó). Có giết -9 làm điều này? Nếu không, điều này nên được thực hiện như thế nào?

Câu trả lời:


14
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 .


4

(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

Hấp dẫn. Bạn có thể cung cấp bất kỳ ví dụ, xin vui lòng?
roaima

> và sau đó được tiếp tục lại thông qua SIGCONT <nó nói rằng cuộc gọi hệ thống nhận được EINTRkhi 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
myaut 18/03/2016

0

Bạn có thể sử dụng pkill để gửi STOPCONTtí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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.