मैं लिनक्स पर इस प्रक्रिया को क्यों नहीं मार सकता?


8

मुसीबत

मैं raspivid (प्रोग्राम जो एक रास्पबेरी पाई कैमरा का उपयोग करके वीडियो रिकॉर्ड करता है) नामक एक प्रक्रिया को मारना चाहता हूं, लेकिन मैं नहीं कर सकता ...

यह मैं इसे कैसे कहते हैं:

#!/bin/bash

#Start recording...
raspivid -w 800 -h 600 -t 15000 -o $1 -v -n -rot 270 >> /home/pi/log/camera_output.txt 2>&1 &

#Waiting the video to be complete
sleep 16

#Killing child process
sudo kill -9 $!

#Killing parent process
sudo kill -9 $$

यदि मैं इस प्रक्रिया को खोजता हूं, तो यह अभी भी है:

pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     7234  0 21:53 ?        00:00:00 [raspivid]
pi       17096 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid

अगर मैं इसे मारने की कोशिश करता, तो यह मरता नहीं। इसके बजाय यह मूल PID को 1 में बदल देता है:

pi@raspberrypi ~ $ sudo killall raspivid
pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     1  0 21:53 ?        00:00:00 [raspivid]
pi       17196 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid
pi@raspberrypi ~ $ sudo killall raspivid

टिप्पणियों:

  1. कॉल कुछ समय के लिए ठीक काम करता है (2 घंटे या कुछ और) फिर यह लटकने लगता है।
  2. केवल एक भौतिक शक्ति समस्या को हल करती है। मैं टर्मिनल के माध्यम से रिबूट नहीं कर सकता (यह भी लटका हुआ है)

मेरे सवाल:

  1. लिनक्स पेरेंट को PID 1 क्यों देता है?
  2. प्रक्रिया को क्यों नहीं मारा जा सकता है? (मैंने भी कोशिश की sudo kill -9 7238)

जवाबों:


2

मुसीबत

आपकी स्क्रिप्ट संभवतः आपके आदेशों के कारण लाश बना रही हैkill -9 ; जैसा कि जेजलिन उत्तर से सुझाया गया है, कभी भी बिना किसी प्रक्रिया के अचानक प्रक्रिया को मारने के लिए एक अच्छा अभ्यास नहीं है।

से man bashहम पढ़ सकते हैं:

चिह्नित प्रक्रियाएं <defunct> मृत प्रक्रियाएं हैं (तथाकथित " लाश ") जो बनी हुई हैं क्योंकि उनके माता-पिता ने उन्हें ठीक से नष्ट नहीं किया है । मूल प्रक्रिया से बाहर निकलने पर इन प्रक्रियाओं को init (8) से नष्ट कर दिया जाएगा

उत्तर # 1: प्रक्रिया init में PID 1 है और इसके लिए Linux उन्हें PID 1 के साथ अभिभावक प्रदान करता है (क्योंकि यह उन्हें init प्रदान करता है )।

उत्तर # 2: वे सिर्फ इसलिए नहीं मारे जा सकते क्योंकि वे सिर्फ मृत हैं ... यदि उनके माता-पिता initशायद कुछ समय इंतजार करने के लिए पर्याप्त हैं।

एक सिस्टम से लाश को निकालने के लिए, SIGCHLD सिग्नल को पेरेंट को मैन्युअल रूप से किल कमांड का उपयोग करके भेजा जा सकता है। यदि अभिभावक प्रक्रिया अभी भी ज़ोंबी को वापस लेने से इनकार करती है, तो अगला कदम मूल प्रक्रिया को हटाना होगा। जब कोई प्रक्रिया अपने माता-पिता को खो देती है, तो init उसका नया अभिभावक बन जाता है। Init समय-समय पर माता-पिता के रूप में init के साथ किसी भी लाश को निकालने के लिए प्रतीक्षा प्रणाली कॉल को निष्पादित करता है। [1]

शायद ज़रुरत पड़े इस विचार एक दिन या एक और उठता है: करने के लिए #kill -9 initमूल विशेषाधिकार के साथ प्रक्रिया शारीरिक रूप से करने के लिए सॉफ्टवेयर बराबर बिजली ग्रिड से कंप्यूटर को अनप्लग है। [:-)]

हालांकि ज़ोंबी प्रक्रियाओंps को STAT कॉलम में "Z" की उपस्थिति से कमांड के आउटपुट में पहचाना जा सकता है । इन्हें आसानी से पहचानने के लिए आप निम्न पंक्ति का उपयोग कर सकते हैं

ps -aux | grep Z

लिनक्स लाश दुनिया के बारे में कुछ संदर्भ :


माता-पिता पीआईडी ​​1 के साथ एक प्रक्रिया एक ज़ोंबी नहीं है। एक प्रक्रिया इस माता-पिता को तब मिलती है जब उसके माता-पिता को मारने से पहले उसे मार दिया जाता है। तो उसका killallस्पष्ट रूप से माता-पिता को मार रहा है, न कि वह प्रक्रिया जिसे वह चाहता था।
बमर

आप <defunct>उसके psआउटपुट में कहां देखते हैं ? इस सवाल से क्या लेना-देना है?
बमर

@ बरमार मैंने नहीं देखा। दुर्भाग्य से हमेशा समस्या बिल्कुल नहीं होती है जहाँ आप खोज रहे हैं । से BTW $!वह kill -9एक कैमरा के साथ पृष्ठभूमि प्रक्रिया इंतजार कर ... के बाद एक के बिना sleep 16वह माता-पिता , अचानक फिर से। इसमें से गंध निकलीज़ोंबी ... गंध (:-)) के बाद आप देख सकते हैं कि, निम्नलिखित के साथ, वह अभी भी जीवित है, लेकिन माता-पिता को मार दिया गया था (-9)। kill -9ps -ef
हस्त्तूर

1
मुझे लगता है कि आप अनाथ प्रक्रियाओं को ज़ोंबी प्रक्रियाओं के साथ भ्रमित कर रहे हैं, लेकिन वे असंबंधित हैं।
बारमर B

स्क्रिप्ट फिर से देखना: वह kill -9अपनी प्रक्रिया है। यह उचित है कि इसे मार दिया जाए और गैर-प्रभावी कॉल के बाद भी इसे <ढ्डह्म> ... और भी अधिक sudo killall raspivid। यह भी संभव है कि raspividअनाथ बने रहने वाली अपनी स्वयं की बाल प्रक्रियाओं को जन्म दे। BTW यह "ps -aux | grep Z" करने के लिए पर्याप्त है यह देखने के लिए कि यह ज़ोंबी है या नहीं, और kill -9मुख्य स्क्रिप्ट में प्रक्रिया से बचने के लिए यह (पर्याप्त) होना चाहिए ।
Hastur

4

प्रश्न संख्या 1 का उत्तर देने के लिए:

जब एक प्रक्रिया बच्चे की प्रक्रियाओं को जन्म देती है, तो बच्चों में प्रत्येक का अपना पीआईडी ​​होता है। प्रत्येक बच्चे का पीपीआईडी ​​(माता-पिता की प्रक्रिया आईडी) उनकी मूल प्रक्रिया का पीआईडी ​​है। यदि माता-पिता की मृत्यु हो जाती है, तो बच्चे की प्रक्रिया अनाथ हो जाती है। अनाथ प्रक्रियाओं को स्वचालित रूप से सिस्टम इनिट प्रक्रिया द्वारा उठाया जाता है जिसमें 1 का पीआईडी ​​होता है।


0

कार्यक्रम में संभवतः कैमरा डिवाइस खुला है, और इसे जबरन मारने से, आपने इसे ठीक से साफ करने की अनुमति नहीं दी है, इसलिए अब यह अटक गया है।

कुछ अवलोकन:

  • यह आमतौर पर एक कार्यक्रम को मारने के लिए एक अच्छा विचार नहीं है -9 के साथ शुरू करके जब तक आप यह नहीं जानते कि आप क्या कर रहे हैं। बस एक सामान्य मार (कोई विकल्प नहीं है) ठीक है।
  • आपकी लिपि में किसी भी तरह की हत्या करने की आवश्यकता नहीं होनी चाहिए। आप -t 15000वीडियो की लंबाई निर्दिष्ट करने के लिए पहले ही कार्यक्रम में जा चुके हैं, इसलिए पहली हत्या अनावश्यक होनी चाहिए। दूसरी मार भी अनावश्यक है क्योंकि जब यह स्क्रिप्ट के अंत तक पहुंच जाती है तो शेल अपने आप बाहर निकल जाएगा। यदि प्रोग्राम अपने आप से बाहर नहीं हो रहा है (जैसा कि उसे होना चाहिए), तो आपको अन्य समस्याएं हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.