Tangguhkan proses tanpa membunuhnya

11

Jadi saya punya program gigih yang berjalan di latar belakang. Membunuh itu hanya menyebabkannya restart dengan PID yang berbeda. Saya ingin menangguhkannya (menidurkannya tanpa benar-benar membunuhnya). Apakah kill -9 melakukan ini? Jika tidak, bagaimana ini harus dilakukan?

kovach.j
sumber

Jawaban:

14
kill -STOP $PID
[...]
kill -CONT $PID

@jordanm menambahkan: Juga perhatikan bahwa seperti SIGKILL ( kill -9), SIGSTOP tidak dapat diabaikan.

Hauke ​​Laging
sumber
4

(Juga untuk menjawab pertanyaan duplikat / tertutup. Bagaimana saya bisa menjeda atau membekukan proses yang sedang berjalan ? , menanyakan apa yang harus dilakukan ketika aplikasi mogok setelah melanjutkan.)

Ada proses yang tidak dilanjutkan dengan benar setelah kill -STOP $PID& kill -CONT $PID. Jika demikian, Anda dapat mencoba pos pemeriksaan / pengembalian dengan CRIU . Jika Anda tidak keberatan dengan overhead Anda juga dapat menjalankan proses di mesin virtual, yang dapat Anda tangguhkan.

Salah satu alasan mengapa suatu proses tidak dilanjutkan setelah SIGSTOP / SIGCONT bisa jadi beberapa sistem pemblokiran panggilan di Linux gagal dengan EINTR ketika proses dihentikan dan kemudian dilanjutkan melalui SIGCONT. Dari sinyal (7) :

Gangguan panggilan sistem dan fungsi pustaka oleh sinyal berhenti

Di Linux, bahkan jika tidak ada penangan sinyal, antarmuka pemblokiran tertentu dapat gagal dengan kesalahan EINTR setelah proses dihentikan oleh salah satu sinyal berhenti dan kemudian dilanjutkan melalui SIGCONT. Perilaku ini tidak disetujui oleh POSIX.1, dan tidak terjadi pada sistem lain.

[...]

Salah satu panggilan sistem yang terpengaruh adalah epoll_wait (2) . Contoh:

#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;
}

Kompilasi dan jalankan:

$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+  Stopped                 ./example
$ fg
./example
epoll_wait: Interrupted system call
Peter
sumber
Menarik. Apakah Anda dapat memberikan contoh, tolong?
roaima
> dan kemudian kembali melalui SIGCONT <ia mengatakan bahwa panggilan sistem didapat EINTRsaat SIGCONTdikirim ke proses yang dihentikan. Program tetap berhenti sampai SIGCONTdikirim
myaut
0

Anda dapat menggunakan pkill untuk mengirim STOPdan CONTmemberi sinyal ke nama proses, sehingga Anda tidak perlu mencari tahu PID.

Untuk menangguhkan proses dengan nama:

 pkill --signal STOP ProcessNameToSuspend

Untuk membangunkan kembali proses itu:

 pkill --signal CONT ProcessNameToSuspend
Alex Stragies
sumber