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?
kill -STOP $PID
[...]
kill -CONT $PID
@jordanm ajoute: Notez également que, comme SIGKILL ( kill -9
), SIGSTOP ne peut pas être ignoré.
(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
EINTR
lorsqu'il estSIGCONT
envoyé au processus arrêté. Le programme reste arrêté jusqu'à ce qu'ilSIGCONT
soit envoyéVous pouvez utiliser pkill pour envoyer les signaux
STOP
etCONT
aux processus-noms, afin que vous n'ayez pas besoin de trouver le PID.Pour suspendre un processus par son nom:
Pour réactiver ce processus:
la source