İşlemi öldürmeden askıya alma


11

Arka planda sürekli olarak çalışan bir program var. Bunu öldürmek sadece farklı bir PID ile yeniden başlamasına neden olur. Askıya almak istiyorum (gerçekten öldürmeden uykuya dalmak). Kill -9 bunu yapıyor mu? Değilse, bu nasıl yapılmalıdır?

Yanıtlar:


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

@jordanm ekler: SIGKILL ( kill -9) gibi SIGSTOP'un da göz ardı edilemeyeceğini unutmayın .


4

(Yinelenen / kapalı soruyu da yanıtlamak için Çalıştırma işlemini nasıl duraklatabilir veya dondurabilirim? Uygulamalar devam ettikten sonra ne zaman çökeceklerini sorabilirim.)

kill -STOP $PID& İşaretinden sonra düzgün şekilde devam etmeyen işlemler var kill -CONT $PID. Bu durumda, CRIU ile kontrol noktası / geri yüklemeyi deneyebilirsiniz . Yükü dikkate almazsanız, işlemi askıya alabileceğiniz sanal bir makinede de çalıştırabilirsiniz.

SIGSTOP / SIGCONT'dan sonra bir işlemin devam etmemesinin bir nedeni, işlem durdurulduğunda ve daha sonra SIGCONT aracılığıyla sürdürüldüğünde Linux üzerindeki bazı engelleme sistemi çağrılarının EINTR ile başarısız olması olabilir. Gönderen sinyali (7) :

Sistem çağrılarının ve kütüphane işlevlerinin durdurma sinyalleri ile kesilmesi

Linux'ta, sinyal işleyicilerin yokluğunda bile, işlem durdurma sinyallerinden biri tarafından durdurulduktan ve daha sonra SIGCONT üzerinden yeniden başlatıldıktan sonra belirli engelleme arabirimleri EINTR hatasıyla başarısız olabilir. Bu davranış POSIX.1 tarafından onaylanmamıştır ve diğer sistemlerde oluşmaz.

[...]

Etkilenen sistem çağrılarından biri epoll_wait (2) . Misal:

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

Derleyin ve çalıştırın:

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

> ve ardından SIGCONT ile devam ettirilir <sistem çağrısının durdurulan işleme gönderildiğinde EINTRgeldiğini belirtir SIGCONT. Program SIGCONTgönderilinceye kadar durur
myaut

1

Pkill komutunuSTOP ve CONT işlem adlarına göndermek için kullanabilirsiniz , böylece PID'yi bulmanıza gerek kalmaz.

Bir işlemi ada göre askıya almak için:

 pkill --signal STOP ProcessNameToSuspend

Bu işlemi yedeklemek için:

 pkill --signal CONT ProcessNameToSuspend

Standart sistemlerde , diğer tüm komut öğelerinin yanı sıra - için de TABtamamlama vardır ProcessName.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.