Suspendre le processus sans le tuer


11

J'ai donc un programme persistant exécuté en arrière-plan. Le tuer le fait simplement redémarrer avec un PID différent. Je voudrais le suspendre (le mettre en veille sans le tuer). Est-ce que kill -9 fait ça? Sinon, comment procéder?

Réponses:


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

@jordanm ajoute: Notez également que, comme SIGKILL ( kill -9), SIGSTOP ne peut pas être ignoré.


4

(Aussi pour répondre à la question en double / fermée Comment puis-je suspendre ou geler un processus en cours?, Demandant ce qu'il faut faire lorsque les applications se bloquent après la reprise.)

Il existe des processus qui ne reprennent pas correctement après kill -STOP $PID& kill -CONT $PID. Si tel est le cas, vous pouvez essayer checkpoint / restore avec CRIU . Si cela ne vous dérange pas, vous pouvez également exécuter le processus sur une machine virtuelle, que vous pouvez suspendre.

Une raison pour laquelle un processus ne reprend pas après SIGSTOP / SIGCONT pourrait être que certains appels système bloquants sur Linux échouent avec EINTR lorsque le processus est arrêté puis repris via SIGCONT. Du signal (7) :

Interruption des appels système et des fonctions de bibliothèque par des signaux d'arrêt

Sous Linux, même en l'absence de gestionnaires de signaux, certaines interfaces de blocage peuvent échouer avec l'erreur EINTR après l'arrêt du processus par l'un des signaux d'arrêt puis la reprise via SIGCONT. Ce comportement n'est pas autorisé par POSIX.1 et ne se produit pas sur d'autres systèmes.

[...]

Epoll_wait (2) est l'un des appels système affectés . Exemple:

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

Compiler et exécuter:

$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+  Stopped                 ./example
$ fg
./example
epoll_wait: Interrupted system call

Intéressant. Pouvez-vous fournir des exemples, s'il vous plaît?
roaima

> puis repris via SIGCONT <il indique que l'appel système obtient EINTRlorsqu'il est SIGCONTenvoyé au processus arrêté. Le programme reste arrêté jusqu'à ce qu'il SIGCONTsoit envoyé
myaut

0

Vous pouvez utiliser pkill pour envoyer les signaux STOPet CONTaux processus-noms, afin que vous n'ayez pas besoin de trouver le PID.

Pour suspendre un processus par son nom:

 pkill --signal STOP ProcessNameToSuspend

Pour réactiver ce processus:

 pkill --signal CONT ProcessNameToSuspend
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.