स्पॉनिंग प्रक्रिया का स्रोत कैसे खोजें?


12

मेरे पास RedHat Linux उदाहरण पर जावा प्रक्रिया चल रही है।

समस्या यह है कि मैं इसे मारने के बाद फिर से प्रकट होता रहता हूं। मुझे यकीन नहीं है कि कहाँ देखना है। मैं पहले से ही crontab चला गया, लेकिन कोई किस्मत नहीं।

मैंने PPID को देखा है, लेकिन यह init (1) की ओर इशारा करता है।

किसी भी विचार कैसे मैं स्रोत पता कर सकते हैं?


1
क्या आप हमें कुछ दे सकते हैं? क्या प्रक्रिया उदाहरण के लिए किसी भी फाइल पर लिखती है? क्या आप हमें ps xfप्रोसेस ट्री दिखाने का आउटपुट दिखा सकते हैं ? जैसा कि यह खड़ा है, हमारे पास बहुत कम है।
terdon

आपने कहा कि आप कोंट्राब गए थे ... क्या आपने यह atदेखने के लिए भी जांच की है कि उनमें से कोई एक है?
योस्मोस

क्या आप हमें बता सकते हैं कि आप वास्तव में कौन सा जावा सॉफ्टवेयर चला रहे हैं। मैंने कैसंड्रा जैसे उपकरण देखे हैं, जो वास्तव में कुछ निश्चित सेटअपों में एक अंतर्निहित वॉचडॉग है जो डेटाबेस का एक और उदाहरण फायर करता है एक बार पहली बार विफल होने पर (इनायत बंद नहीं हुई थी)।
मथायस स्टीनबॉयर

जवाबों:


15

कई संभावनाएँ हैं (कुछ अन्य उत्तर में उल्लिखित हैं):

  1. एक प्रणाली या उपयोगकर्ता क्रोनजॉब अक्सर निष्पादित करता है,
  2. SysV init में, निर्देश के /etc/inittabसाथ सेवा के लिए एक प्रविष्टि respawn,
  3. Systemd में, एक इकाई फ़ाइल जिसमें Restartविकल्प को एक मान के अलावा सेट किया गया है no,
  4. उपस्टार्ट में, respawnनिर्देश के साथ एक सेवा विन्यास फाइल ,
  5. एक प्रक्रिया निगरानी उपकरण जैसे monit, या
  6. उस विशेष सेवा के लिए एक तदर्थ प्रहरी प्रक्रिया।

एक दिलचस्प नई (linux-मात्र) है कि जहां प्रक्रिया शुरू कर दी जा रही है में और अधिक जानकारी प्रदान कर सकता है उपकरण sysdig

Sysdig लिनक्स कर्नेल के ट्रेसपॉइंट फीचर्स का उपयोग करता है ताकि एक तेज़, सिस्टम वाइड को कितनी मात्रा प्रदान की जा सके strace

उदाहरण के लिए, यदि मैं हर प्रक्रिया को शुरू होते देखना चाहता हूं, तो मैं lsजारी कर सकता हूं:

sudo sysdig evt.type=execve and evt.arg.exe=ls

जब lsकहीं चलाया जाता है, तो मुझे इस तरह से एक संदेश मिलेगा:

245490 16:53:54.090856066 3 ls (10053) < execve res=0 exe=ls args=--color=auto. tid=10053(ls) pid=10053(ls) ptid=9204(bash) cwd=/home/steved fdlimit=1024 pgft_maj=0 pgft_min=37 vm_size=412 vm_rss=4 vm_swap=0 env=...

मैंने पर्यावरण की जानकारी को वापस लौटा दिया, लेकिन जैसा कि आप देख सकते हैं, ptid में मैं प्रोग्राम कॉलिंग के नाम और पीआईडी ​​को देख सकता हूं। execveलिनक्स में प्रयुक्त सिस्टम कॉल नई कमांड्स को निष्पादित करने के लिए उपयोग किया जाता है (अन्य सभी निष्पादन कॉल केवल निष्पादित करने के लिए हैं)।


2
sysdig एक बेहतरीन सलाह है! BTW, यह अब विंडोज (और मैक, मुझे लगता है) के लिए सीमित कार्यक्षमता के साथ उपलब्ध है।
Neowizard

यहां मोनिट कैसे मदद करता है? मैंने मैनुअल के माध्यम से पढ़ना शुरू किया, लेकिन यह नगीओस जैसी चीज के लिए वैकल्पिक या बैकअप जैसा दिखता है। मैं यह नहीं देख रहा हूं कि यह एक श्वसन प्रक्रिया को ट्रैक करने में आपकी मदद कैसे करेगा।
जेफरसन हडसन

7

मेरा मानना ​​है कि आप उपयोग कर सकते हैं pstree। आप कमांड को इस प्रकार निर्दिष्ट कर सकते हैं,

pstree -p PID

उपरोक्त आपको जावा अनुप्रयोगों के सभी माता-पिता की एक सूची देगा।


1
यह बिल्कुल भी मदद नहीं करेगा, जैसा कि ओपी ने पहले ही कहा था कि वह पीपीआईडी
को देखता

@GuntramBlohm, कृपया संपादित करने से पहले मूल प्रश्न को देखें। प्रश्न के पहले संस्करण में इसका उल्लेख नहीं किया गया था।
रमेश

2
आह। एक और पोस्टर जो उनके सवाल को उनके संपादनों को चिह्नित किए बिना एक
चलता फिरता

5

आप इसकी PPID (मूल प्रक्रिया आईडी) पर एक नज़र डाल सकते हैं:

$ ps -eo pid,ppid,args | grep java

एक बार जब आप अपने जावा प्रोसेस का PPID (दूसरा कॉलम) प्राप्त कर लेते psहैं, तो संबंधित प्रक्रिया को खोजने के लिए फिर से उपयोग करें:

$ ps -p [PPID]

संपादित करें : यदि माता-पिता 1 (init) हैं, तो आपकी जावा प्रक्रिया के पहले माता-पिता की मृत्यु "जन्म देने" (कितने दुख की बात) के ठीक बाद हुई। उसके कारण, आप इसे खोजने के लिए वर्तमान प्रक्रिया पदानुक्रम का उपयोग नहीं कर सकते हैं। पहली चीज जो मैं आपको करने की सलाह दूंगा वह है जांच करना ps -ef। आप आउटपुट को पढ़कर ही अपराधी का पता लगा सकते हैं।

फिर, crontabs पर एक नज़र है (आप इसे पहले से ही किया था, लेकिन यह चोट नहीं करेगा):

$ for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done

इसके लिए रूट विशेषाधिकारों की आवश्यकता होगी।

अभी भी एक जावा प्रक्रिया अनुसूचित नहीं देख सकता है? धत तेरे की। चलो कुछ और कोशिश करते हैं। यदि आपकी जावा प्रक्रिया बूट के बाद से मौजूद है, तो बूट समय पर स्कैल्ड किए गए कार्यक्रमों पर एक नज़र डालें। मैं कुछ सुझाव देना चाहूंगा ...

$ grep -iR java /etc/rc*

अगर आपको अभी भी कुछ नहीं मिल रहा है ... तो मैं मानता हूं कि मैं विचारों से बाहर चल रहा हूं। आपको वास्तव में ps -efजावा-आधारित कार्यक्रमों से जुड़ी प्रक्रियाओं पर एक और नज़र डालनी चाहिए । आपको अपने जावा प्रक्रिया के निरंतर श्वसन के लिए जिम्मेदार एक डेमॉन, या एक "लॉन्चर" आना चाहिए।


मैंने मूल प्रक्रिया देखने की कोशिश की है, लेकिन यह सिर्फ init (PPID = 1) को इंगित करता है। मैं इस जानकारी के साथ प्रश्न को संशोधित करूंगा।
जोस

@JoseChavez, यदि आपका PPID 1 है, तो जो जावा प्रोसेस बन रहे हैं, वे ज़ोंबी प्रोसेस हैं। इस उत्तर को यहां देखें
रमेश

@JoseChavez मैंने आपके मामले में जांच के लिए मेरे जवाब को कुछ और पटरियों के साथ संपादित किया।
जॉन डब्ल्यूएच स्मिथ

2
@ रमेश अगर PPID 1 है, तो वे लाश हो सकते हैं या नहीं हो सकते हैं । यदि वे वास्तव में नहीं थे , तो वे कम से कम अनाथ हैं । करने के लिए विनिर्देशक अगर वे लाश दिखाएगी (जैसे, ); राज्य होगा । initstatepsps -eo pid,ppid,state,commZ
गोल्डीलॉक्स

1
@goldilocks: यदि PPID 1 है, तो वे लाश नहीं हैं , जब तक कि यह प्रक्रिया खराब न हो; यह एक प्रतीक्षा लूप चलाने के लिए चाहिए जो सभी अनाथ लाश को तुरंत हटा देता है।
हमखोलम ने मोनिका

1

यदि आप नहीं जानते कि अभिभावक कौन है, तो आपको कुछ सिस्टम ट्रैसर जैसे ऑडिट करना चाहिए

आप इसके साथ लॉगिंग सक्षम करेंगे:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

और फिर /var/log/audit/audit.logजैसे लाइनों में खोजें:

type=SYSCALL msg=audit(1414027338.620:6232): arch=c000003e syscall=59
success=yes exit=0 a0=7fdea0e4db23 a1=7fffec7c5220 a2=7fffec7c87d0
a3=7fdea1b559d0 items=2 ppid=17176 pid=18182 auid=1000 uid=1000 gid=1000 
euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts8 
ses=2 comm="sh" exe="/bin/dash" key=(null)

(पठनीयता के लिए कई लाइनों में टूट गया)। आप में रुचि रखते हैं exe="/bin/dash"और / या pid=18182जो आपकी रूज प्रक्रिया की पहचान करते हैं जिसे आप देखना चाहते हैं, और ppid=17176जो अभिभावक की पहचान करता है जिसने इसे निष्पादित किया है।

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