इसे मारे बिना प्रक्रिया स्थगित करें


11

इसलिए मुझे बैकग्राउंड में लगातार चलने वाला प्रोग्राम मिला है। इसे मारना बस इसे एक अलग पीआईडी ​​के साथ पुनः आरंभ करने का कारण बनता है। मैं इसे निलंबित करना चाहता हूं (इसे वास्तव में मारे बिना सोने के लिए डाल दें)। मारता है -9 ऐसा करता है? यदि नहीं, तो यह कैसे किया जाना चाहिए?

जवाबों:


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

@jordanm कहते हैं: यह भी ध्यान दें कि SIGKILL ( kill -9) की तरह , SIGSTOP को नजरअंदाज नहीं किया जा सकता है।


4

(डुप्लिकेट / क्लोज्ड प्रश्न का उत्तर देने के लिए मैं रनिंग प्रक्रिया को कैसे रोक या फ्रीज कर सकता हूं?, फिर से शुरू करने के दौरान क्या करना है, इसके बारे में पूछ रहा हूं।)

ऐसी प्रक्रियाएं हैं जो ठीक से 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

दिलचस्प। क्या आप कोई उदाहरण प्रदान करने में सक्षम हैं, कृपया?
रोएमा

> और फिर SIGCONT <के माध्यम से फिर से शुरू किया गया <यह कहता है कि सिस्टम कॉल EINTRतब SIGCONTबंद हो जाती है जब प्रक्रिया को रोक दिया जाता है। जब तक कार्यक्रम SIGCONTभेजा नहीं जाता तब तक रुक जाता है
myaut

0

आप प्रोसेस-नेम को सिग्नल और भेजने के लिए pkill का उपयोग कर सकते हैं , ताकि आपको PID का पता लगाने की आवश्यकता न हो।STOPCONT

नाम से एक प्रक्रिया को स्थगित करने के लिए:

 pkill --signal STOP ProcessNameToSuspend

उस प्रक्रिया को जगाने के लिए:

 pkill --signal CONT ProcessNameToSuspend
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.