2008-12-17 14 views
5

का उपयोग किए बिना किसी प्रक्रिया के पीआईडी ​​को ढूंढें मेरे पास एक प्रक्रिया का नाम है और मुझे kill() उस प्रक्रिया को सिग्नल भेजना है, लेकिन मुझे kill() पर कॉल करने के लिए इसकी पीआईडी ​​चाहिए। मैं केवल उपयोग करना चाहते हैं:पॉपन() या सिस्टम()

popen("pidof process_name"); 
आखिरी बात के रूप में

। क्या प्रक्रिया 'पीआईडी' खोजने का कोई और तरीका है? एक तरीका मैं सोच सकता था कि उस प्रक्रिया के लिए सॉकेट अनुरोध भेजना और उसके पीआईडी ​​से पूछना है।

दूसरा तरीका एक साधारण कोड के लिए थोड़ा जटिल है जो मैं लिख रहा हूं: ऐसा करने के लिए pidof command's source code वास्तव में कर रहा है (यह फ़ंक्शन कॉल find_pid_by_name() का उपयोग करता है लेकिन यह बहुत सी चीजें कर रहा है)। अपनी वापसी कोड की जाँच

system("pkill <process_name>"); 

और:

कोई सरल उपाय संभव है, तो मैं यह करने के है। लेकिन क्या सभी लिनक्स मशीनों पर निश्चित रूप से उपलब्ध होगा?

उत्तर

4

आपने बताया कि आप लिनक्स का उपयोग कर रहे थे। यह साफ समाधान नहीं है, लेकिन आप/proc में प्रत्येक प्रविष्टि के माध्यम से जाने के लिए और आप के लिए क्या देख रहे के खिलाफ cmdline में प्रक्रिया नाम देख सकते हैं।

+0

सुंदर सीधे आगे होना चाहिए :: बढ़ावा का उपयोग कर regex और बढ़ावा देने :: फाइल सिस्टम मुझे लगता है कि मैं एक बार –

+0

pidof की strace उत्पादन में देखा, और लगा कि यह उसी तरह से करता है। (बीच में परिवर्तित हो सकती है, हालांकि) –

+2

procfs पढ़ता बहुत सस्ता कर रहे हैं। इस विशेष उद्देश्य के लिए, आपको पीआईडी ​​1000 तक पहुंचने तक वास्तव में पढ़ना शुरू नहीं करना पड़ेगा, फिर आपके पास जांच करने के लिए 40 - 60 है। पारंपरिक एफएस पढ़ने की तरह मत सोचो, यह बहुत सस्ता है। –

4

उपयोग sysctl - Example code

संपादित करें - यह लिनक्स see here

+0

धन्यवाद एक बहुत! मैं इसमें देख लूंगा। – Srikanth

+1

यह केवल * बीएसडी पर काम करता है, लिनक्स नहीं। – ephemient

0

में उपलब्ध है यह मेरे लिए अच्छा काम करने लगता है।

हालांकि आप प्रक्रिया का पूरा मार्ग देना चाहते हैं, भले ही आप ऐसी प्रक्रिया को मार दें जो समान नाम है।

इसका मुख्य लाभ यह है कि आप सिग्नल निर्दिष्ट कर सकते हैं जिसे आप भेजना चाहते हैं।

system("killall -s 9 process_name"); 
+0

यह pkill संस्करण से अलग नहीं है ... –

0

F_GETOWN साथ fcntl उपयोग करने के लिए क्यों नहीं?

+0

काम करता है कि एक सॉकेट वर्णनकर्ता और देखभाल पर फोन fcntl अगर आपके एक पीआईडी ​​या एक प्रक्रिया समूह (fcntl से एक नकारात्मक परिणाम) हो रही साकार करने के लिए लिया जाना चाहिए करते हों। F_GETOWN के साथ सामान्य फ़ाइल पर fcntl को कॉल करना POSIX में निर्दिष्ट नहीं है। http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html –

2

प्रोसेस पढ़ता है बहुत सस्ता है, कई लोग/proc के माध्यम से पुनरावृत्ति के बारे में सोचते हैं जैसे कि वे इसके माध्यम से पुन: प्रयास करेंगे, वास्तव में यह मामला नहीं है।

1000 से कम की किसी भी प्रविष्टि को छोड़कर कुछ समय बचाएं, कर्नेल धागे की जांच करने में कोई समझ नहीं है। तो, मूल रूप से .. opendir के बाद(), strtoint() सोचता है कि प्रवेश एक पूर्णांक है, और उस पूर्णांक से अधिक या 1000 के बराबर है, तो बस/proc /% d/स्टेट पढ़ें।

'exe' लिंक को हल करने के आग्रह से बचने का प्रयास करें, क्योंकि यह आपको उस प्रक्रिया की स्थिति बताने वाला नहीं है जो सिग्नल प्राप्त करेगा। उदाहरण के लिए, यदि लक्ष्य राज्य 'डी' (डिस्क नींद) में है, तो आप को पता है के रूप में संकेत तुरंत वितरित नहीं किया जाएगा, या शायद कभी नहीं, अगर डी राज्य बारहमासी है चाहेंगे।

अधिकांश प्रणालियों पर, जांच करने के लिए 70 - 120 प्रक्रियाएं होने जा रही हैं और अंत में पहुंचने से पहले आपको अपना लक्षित तरीका मिल जाएगा।

+0

@tinkertim: टिप के लिए धन्यवाद,/proc में पढ़ने एक एफएस पढ़ने जैसा नहीं है पता नहीं था! – Srikanth

2

आप उल्लेख करते हैं, "एक तरीका मैं सोच सकता हूं कि उस प्रक्रिया में सॉकेट अनुरोध भेजना और उसके पीआईडी ​​से पूछना है।" ऐसा लगता है कि जिस प्रक्रिया को आप मारने की कोशिश कर रहे हैं वह एक प्रोग्राम है जिसे आपने लिखा था।

यदि ऐसा है, तो प्रोग्राम को चलने के दौरान, फ़ाइल को चलाने के दौरान, आमतौर पर/var/run, यदि आपके पास पहुंच है) में फ़ाइल को ढक्कन को स्टोर करना है, और प्रोग्राम को हटा दें बाहर निकलता है।इस तरह से, का पता लगाने या नहीं, कार्यक्रम चल रहा है

if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then 
    echo Running! 
else 
    rm -f /var/run/myprog.pid 
    echo "Not running." 
end 

ऊपर कोड के सभी निहितार्थ शायद आप के बारे में कैसे पीआईडी ​​फ़ाइलें काम एक बहुत सिखा देगा की सावधानी से अध्ययन के रूप में सरल

के रूप में है। या आप सिर्फ एक और विस्तृत स्पष्टीकरण के लिए पूछ सकते हैं।

0

@GregRogers जवाब पूरा करने के लिए, तो आप सिर्फ pidof के कार्यान्वयन की जांच की आवश्यकता

आप देख सकते हैं, क्योंकि यह केवल/proc निर्देशिका पर खोज ।