यहाँ देखें
कर रहे हैं दो संकेत है कि एक प्रक्रिया के निष्पादन को निलंबित कर सकते हैं। एक "सुशोभित" है, और एक "बलशाली" है।
"सुशोभित" एक है SIGTSTP
, और इसका उद्देश्य "अच्छी तरह से" प्रक्रिया को पूछना है, अगर यह ऐसा लगता है, तो निष्पादन को निलंबित करने के लिए जब तक कि यह प्राप्त न हो जाए SIGCONT
। के मामले में SIGTSTP
, प्रक्रिया SIGTSTP को अनदेखा कर सकती है और वैसे भी निष्पादित कर सकती है, इसलिए इसके लिए ऐसे प्रोग्राम से सहयोग की आवश्यकता होती है जिसे SIGTSTP को संभालने के लिए डिज़ाइन किया गया हो।
"बलशाली" एक है SIGSTOP
, और इसका उद्देश्य उस प्रक्रिया से जुड़े सभी उपयोगकर्ता थ्रेड को निलंबित करना है। इस प्रक्रिया को अनदेखा करना SIGSTOP
उतना ही असंभव है जितना कि इसे अनदेखा करना है SIGKILL
(बाद वाला इस प्रक्रिया को बलपूर्वक मारता है)।
यहां उल्लिखित किसी भी सहित, एक मनमाना संकेत भेजने के लिए, आप कार्यक्रमों का उपयोग कर सकते हैं kill
, जैसे killall
, या pkill
; या सिस्टम कॉल का उपयोग करें kill(2)
। प्लेटफ़ॉर्म / आर्किटेक्चर / संस्करण-निर्भर विवरण और इरेटा के लिए अपने ऑपरेटिंग सिस्टम के मैनपेज़ देखें। ध्यान दें कि इन सभी आदेशों और syscall में "किल" शब्द एक गलत मिथ्या नाम है। इन आदेशों को डिज़ाइन नहीं किया गया है, विशेष रूप से, प्रक्रियाओं को समाप्त करने के लिए। वे संकेतों के कुछ लोगों को भेजकर ऐसा कर सकते हैं; लेकिन संकेतों का उपयोग किसी प्रक्रिया को समाप्त करने के अलावा कार्यक्षमता के लिए भी किया जा सकता है। उदाहरण के लिए, SIGSTOP
केवल प्रक्रिया को निलंबित करता है, और यह केवल कई संकेतों में से एक है जिसे इस तरह भेजा जा सकता है।
समय की अवधि समाप्त होने के बाद प्रक्रिया को स्वचालित रूप से फिर से शुरू करने की एक शर्त जोड़ने के लिए, आपको निगरानी प्रक्रिया को चलाने के लिए किसी प्रकार की निगरानी प्रक्रिया का उपयोग करना होगा और टाइमर सेट करना होगा, जो बाद में kill(2)
फिर से कॉल करता है। SIGCONT
कर्नेल को निष्पादन को फिर से शुरू करने का अनुरोध करने के लिए, संकेतित प्रक्रिया को संकेत भेजता है । ध्यान दें कि लिनक्स में सटीकता और परिशुद्धता के विभिन्न डिग्री के साथ कई समय तंत्र हैं; इसके अलावा, यदि आपका सिस्टम बहुत व्यस्त है, तो आपकी निगरानी की प्रक्रिया तब तक नहीं जा सकती है, जब तक कि उसके टाइमर की समय सीमा समाप्त नहीं हो जाती है, और इस प्रकार वेकअप में देरी हो सकती है।
यदि आप निलंबन की बहुत सटीक सटीकता और निलंबित प्रक्रिया को फिर से शुरू करने पर निर्भर करते हैं, तो आपको अपना निगरानी कार्यक्रम वास्तविक समय अनुमतियों के साथ चलाने की आवश्यकता हो सकती है ( अपनी प्रक्रिया को वास्तविक समय बनाने के बारे में जानकारी के लिए इस पृष्ठ पर देखें sched_setscheduler(2)
)। आप उच्च-रिज़ॉल्यूशन टाइमर का उपयोग कर सकते हैं, लिनक्स कर्नेल की एक विशेषता (जो केवल तभी उपलब्ध होती है जब आपका हार्डवेयर उनके लिए समर्थन प्रदान करता है), वास्तविक समय निर्धारण के संयोजन में, समय पर बहुत सटीक, उप-मिलीसेकंड सटीक प्राप्त करने के लिए , फिर जाग्रत करें और बहुत जल्द निगरानी प्रक्रिया को फिर से शुरू करने के लिए संकेत भेजें।
आपने यह नहीं बताया कि आप इसे लागू करने के लिए किन तकनीकों का उपयोग करना चाहते हैं। एक न्यूनतम न्यूनतम पर, आपको कम से कम बैश स्क्रिप्टिंग की आवश्यकता होगी, हालांकि आप उस तरह से बहुत ठीक-ठीक समय प्राप्त नहीं कर पाएंगे। यहाँ एक बैश "स्क्रिप्ट" (अनटाइटेड है, इसलिए कृपया सावधान रहें) जो आपकी क्वेरी की अवधारणा का एक प्रमाण है। यदि आपको सटीक समय की आवश्यकता है, तो आपको एक कार्यक्रम लिखना होगा, शायद C / C ++ या किसी अन्य मूल भाषा में, और वास्तविक समय निर्धारण और hrtimers का उपयोग करें।
#!/bin/bash
#This is the process you want to suspend.
screen -mdS child bash -c "cat /dev/urandom | base64"
#This is the process ID of the child process
THEPID=$(screen -list | grep child | cut -f1 -d'.' | sed 's/\W//g')
#Send SIGSTOP to the child process.
kill -SIGSTOP ${THEPID}
#Now it is suspended. This process will sleep for 10 seconds asynchronously, then resume the process.
screen -mdS monitor bash -c "sleep 10; kill -SIGCONT ${THEPID}"
ध्यान दें कि स्क्रिप्ट समाप्त हो जाएगी और नियंत्रण स्क्रिप्ट समाप्त हो जाएगी, लेकिन screen
मॉनिटर प्रक्रिया को नियंत्रित करने के कारण , यह 10 सेकंड के लिए पृष्ठभूमि में चलती रहेगी (तर्क के आधार पर sleep
) और फिर जागने और बच्चे की प्रक्रिया जारी रखें। लेकिन यह लंबे समय बाद होगा जब नियंत्रित स्क्रिप्ट समाप्त हो जाएगी। यदि आप समय बीतने के लिए समकालिक रूप से प्रतीक्षा करना चाहते हैं, तो बस दूसरी कॉल को छोड़ दें screen
और नींद को हार्ड-कोड करें और कंट्रोलिंग स्क्रिप्ट में मार दें।
आप परीक्षण कर सकते हैं कि प्रक्रिया वास्तव में चल रही है
screen -rS child
इस स्क्रिप्ट को शुरू करने के बाद। आपको कंसोल पर कुछ भी दिखाई नहीं देगा। फिर टाइमर समाप्त होने (10 सेकंड) के बाद, यह आपकी स्क्रीन को बेस 64 डेटा (0-9 और एएफ से यादृच्छिक वर्ण) के साथ बाढ़ देगा। बाहर निकलने के लिए Ctrl + C दबाएं।