Призупиніть процес, не вбиваючи його


11

Тож у мене на задньому плані працює наполеглива програма. Вбивство просто змушує його перезапустити інший PID. Я хотів би призупинити його (покласти його спати, фактично не вбиваючи). Чи вбиває -9 це робить? Якщо ні, то як це робити?

Відповіді:


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

@jordanm додає: Також зауважте, що як і SIGKILL ( kill -9), SIGSTOP не можна ігнорувати.


4

(Також щоб відповісти на повторне / закрите запитання. Як я можу призупинити або заморозити запущений процес ? , запитуючи про те, що робити, коли програми завершуються аварійно після відновлення.)

Є процеси, які не відновляються належним чином після kill -STOP $PID& kill -CONT $PID. Якщо це так, ви можете спробувати контрольно-пропускний пункт / відновити за допомогою CRIU . Якщо ви не заперечуєте проти накладних витрат, ви також можете запустити процес у віртуальній машині, яку ви можете призупинити.

Однією з причин того, що процес не поновлюється після SIGSTOP / SIGCONT, може бути те, що деякі блокуючі системні виклики в Linux виходять з ладу з EINTR, коли процес зупиняється та відновлюється через SIGCONT. З сигналу (7) :

Переривання системних викликів та функцій бібліотеки стоп-сигналами

У Linux, навіть за відсутності обробників сигналів, певні блокуючі інтерфейси можуть вийти з ладу EINTR з помилкою після того, як процес зупиняється одним із зупиняючих сигналів і потім поновлюється через SIGCONT. Така поведінка не санкціонується POSIX.1 і не відбувається в інших системах.

[...]

Один із системних викликів, на які впливає вплив, - epoll_wait (2) . Приклад:

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

Складіть і запустіть:

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

Цікаво. Чи можете ви надати будь-які приклади, будь ласка?
roaima

>, а потім відновлено через SIGCONT <говорить про те, що системний виклик отримує, EINTRколи він SIGCONTнадсилається до зупиненого процесу. Програма залишається зупиненою, поки не SIGCONTбуде надіслано
myaut

0

Ви можете використовувати pkill для надсилання STOPі CONTсигналів для імен процесів, так що вам не потрібно буде дізнаватися PID.

Щоб призупинити процес на ім'я:

 pkill --signal STOP ProcessNameToSuspend

Щоб пробудити резервне копіювання цього процесу:

 pkill --signal CONT ProcessNameToSuspend
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.