जवाबों:
kill -STOP $PID
[...]
kill -CONT $PID
@jordanm कहते हैं: यह भी ध्यान दें कि SIGKILL ( kill -9
) की तरह , SIGSTOP को नजरअंदाज नहीं किया जा सकता है।
(डुप्लिकेट / क्लोज्ड प्रश्न का उत्तर देने के लिए मैं रनिंग प्रक्रिया को कैसे रोक या फ्रीज कर सकता हूं?, फिर से शुरू करने के दौरान क्या करना है, इसके बारे में पूछ रहा हूं।)
ऐसी प्रक्रियाएं हैं जो ठीक से kill -STOP $PID
और के बाद फिर से शुरू नहीं होती हैं kill -CONT $PID
। यदि ऐसा है तो आप CRIU के साथ चेकपॉइंट / रिस्टोर की कोशिश कर सकते हैं । यदि आपको ओवरहेड से कोई आपत्ति नहीं है, तो आप एक वर्चुअल मशीन में भी प्रक्रिया को चला सकते हैं, जिसे आप निलंबित कर सकते हैं।
SIGSTOP / SIGCONT के बाद एक प्रक्रिया फिर से शुरू नहीं होने का एक कारण यह हो सकता है कि लिनक्स पर कुछ ब्लॉकिंग सिस्टम कॉल EINTR के साथ विफल हो जाते हैं जब प्रक्रिया को रोक दिया जाता है और फिर SIGCONT के माध्यम से फिर से शुरू किया जाता है। से संकेत (7) :
सिग्नल को रोकने के द्वारा सिस्टम कॉल और लाइब्रेरी फ़ंक्शंस का व्यवधान
लिनक्स पर, सिग्नल हैंडलर की अनुपस्थिति में भी, कुछ अवरुद्ध इंटरफेस त्रुटि 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 का उपयोग कर सकते हैं , ताकि आपको PID का पता लगाने की आवश्यकता न हो।STOP
CONT
नाम से एक प्रक्रिया को स्थगित करने के लिए:
pkill --signal STOP ProcessNameToSuspend
उस प्रक्रिया को जगाने के लिए:
pkill --signal CONT ProcessNameToSuspend