ดังนั้นฉันจึงมีโปรแกรมถาวรที่ทำงานอยู่เบื้องหลัง การฆ่ามันเพียงแค่ทำให้มันเริ่มต้นใหม่ด้วย PID ที่แตกต่างกัน ฉันต้องการที่จะระงับ (ทำให้นอนโดยไม่ฆ่ามัน) kill -9 ทำสิ่งนี้หรือไม่ ถ้าไม่ควรทำอย่างไร?
ดังนั้นฉันจึงมีโปรแกรมถาวรที่ทำงานอยู่เบื้องหลัง การฆ่ามันเพียงแค่ทำให้มันเริ่มต้นใหม่ด้วย PID ที่แตกต่างกัน ฉันต้องการที่จะระงับ (ทำให้นอนโดยไม่ฆ่ามัน) kill -9 ทำสิ่งนี้หรือไม่ ถ้าไม่ควรทำอย่างไร?
คำตอบ:
kill -STOP $PID
[...]
kill -CONT $PID
@jordanm เพิ่ม: โปรดทราบว่าเช่น SIGKILL ( kill -9
) SIGSTOP จะไม่สามารถละเว้นได้
(นอกจากนี้เพื่อตอบคำถามซ้ำซ้อน / ปิดฉันจะหยุดชั่วคราวหรือหยุดกระบวนการทำงานได้อย่างไรถามเกี่ยวกับสิ่งที่ต้องทำเมื่อแอปพลิเคชันหยุดทำงานหลังจากทำงานต่อ)
มีกระบวนการที่ไม่ถูกต้องหลังจากกลับมาเป็น&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
EINTR
เมื่อSIGCONT
ถูกส่งไปยังกระบวนการที่หยุดทำงาน โปรแกรมจะหยุดทำงานจนกว่าSIGCONT
จะถูกส่ง
คุณสามารถใช้pkillเพื่อส่งSTOP
และCONT
ส่งสัญญาณไปยังชื่อกระบวนการดังนั้นคุณไม่จำเป็นต้องค้นหา PID
หากต้องการระงับกระบวนการด้วยชื่อ:
pkill --signal STOP ProcessNameToSuspend
หากต้องการปลุกกระบวนการสำรองให้ทำดังนี้
pkill --signal CONT ProcessNameToSuspend