หยุดกระบวนการโดยไม่ฆ่ามัน


11

ดังนั้นฉันจึงมีโปรแกรมถาวรที่ทำงานอยู่เบื้องหลัง การฆ่ามันเพียงแค่ทำให้มันเริ่มต้นใหม่ด้วย PID ที่แตกต่างกัน ฉันต้องการที่จะระงับ (ทำให้นอนโดยไม่ฆ่ามัน) kill -9 ทำสิ่งนี้หรือไม่ ถ้าไม่ควรทำอย่างไร?

คำตอบ:


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

@jordanm เพิ่ม: โปรดทราบว่าเช่น SIGKILL ( kill -9) SIGSTOP จะไม่สามารถละเว้นได้


4

(นอกจากนี้เพื่อตอบคำถามซ้ำซ้อน / ปิดฉันจะหยุดชั่วคราวหรือหยุดกระบวนการทำงานได้อย่างไรถามเกี่ยวกับสิ่งที่ต้องทำเมื่อแอปพลิเคชันหยุดทำงานหลังจากทำงานต่อ)

มีกระบวนการที่ไม่ถูกต้องหลังจากกลับมาเป็น&kill -STOP $PID kill -CONT $PIDหากเป็นกรณีที่คุณสามารถลองด่าน / restore กับ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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.