จะค้นหาแหล่งที่มาของกระบวนการวางไข่ได้อย่างไร


12

ฉันมีกระบวนการ Java ที่ทำงานบนอินสแตนซ์ RedHat Linux

ปัญหาคือมันปรากฏขึ้นอีกครั้งหลังจากที่ฉันฆ่ามัน ฉันไม่แน่ใจว่าจะมองที่ไหน ฉันไป crontab แล้ว แต่ไม่มีโชค

ฉันดู PPID แล้ว แต่มันก็ชี้ไปที่ init (1)

ความคิดใดที่ฉันสามารถค้นหาแหล่งที่มา?


1
คุณให้อะไรเราได้ไหม กระบวนการเขียนไปยังไฟล์ใด ๆ หรือไม่? คุณสามารถแสดงเอาท์พุทของการps xfแสดงแผนผังกระบวนการให้เราเห็นได้หรือไม่? เรามีน้อยมากที่จะดำเนินต่อไป
terdon

คุณบอกว่าคุณไป crontab ... คุณได้ตรวจสอบatเพื่อดูว่ามีอย่างใดอย่างหนึ่งหรือไม่
YoMismo

คุณช่วยบอกเราเกี่ยวกับซอฟต์แวร์จาวาที่คุณใช้งานอยู่ ฉันได้เห็นเครื่องมือต่าง ๆ เช่น Cassandra ที่มี watchdog ในตัวในการตั้งค่าบางอย่างที่เพิ่งเริ่มต้นอินสแตนซ์อื่นของฐานข้อมูลเมื่ออินสแตนซ์แรกล้มเหลว (ไม่หยุดอย่างสง่างาม)
Matthias Steinbauer

คำตอบ:


15

มีความเป็นไปได้มากมาย (บางคนกล่าวถึงในคำตอบอื่น ๆ ):

  1. ระบบหรือผู้ใช้ cronjob ที่ทำงานบ่อยครั้ง
  2. ใน SysV init /etc/inittabรายการสำหรับบริการที่มีrespawnคำสั่ง
  3. ใน systemd แฟ้มหน่วยกับRestartชุดตัวเลือกที่จะเป็นค่าอื่นนอกเหนือno,
  4. ใน Upstart ไฟล์การกำหนดค่าบริการที่มีrespawnคำสั่ง
  5. เครื่องมือตรวจสอบกระบวนการเช่นmonitหรือ
  6. กระบวนการเฝ้าระวังแบบเฉพาะกิจสำหรับบริการเฉพาะนั้น

ใหม่ (ลินุกซ์เท่านั้น) เครื่องมือที่น่าสนใจที่จะให้เข้าใจมากขึ้นว่ากระบวนการจะถูกเริ่มต้นเป็นsysdig

Sysdig ใช้ tracepoint 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 ฉันเห็นชื่อและ pid ของโปรแกรมที่เรียกใช้ execve execveคือการเรียกระบบที่ใช้ใน Linux ที่ใช้ในการดำเนินการคำสั่งใหม่


2
sysdig เป็นคำแนะนำที่ดี! BTW ตอนนี้ใช้ได้สำหรับ Windows (และ Mac ฉันคิดว่า) ด้วยฟังก์ชันที่ จำกัด
Neowizard

monit ช่วยได้อย่างไรที่นี่? ฉันเริ่มอ่านคู่มือ แต่ดูเหมือนว่าจะเป็นทางเลือกหรือสำรองข้อมูลบางอย่างเช่น Nagios ฉันไม่เห็นว่ามันจะช่วยให้คุณติดตามกระบวนการ respawning ได้อย่างไร
เจฟเฟอร์สันฮัดสัน

7

pstreeผมเชื่อว่าคุณสามารถใช้ คุณสามารถระบุคำสั่งเป็น

pstree -p PID

ด้านบนจะให้รายการของผู้ปกครองทั้งหมดของแอปพลิเคชัน java


1
สิ่งนี้จะไม่ช่วยเลยเนื่องจาก OP บอกว่าเขาดู PPID ซึ่งก็คือ 1
Guntram Blohm รองรับ Monica

@GuntramBlohm โปรดดูคำถามเดิมก่อนที่จะแก้ไข ไม่ได้กล่าวถึงในคำถามรุ่นแรก
Ramesh

2
ถอนหายใจ โปสเตอร์อื่นที่ทำให้คำถามของเขาเป็นเป้าหมายที่เคลื่อนไหวโดยไม่ทำเครื่องหมายการแก้ไขของเขา :(
Guntram Blohm สนับสนุน Monica

5

คุณสามารถดู PPID ของมัน (ID กระบวนการหลัก):

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

เมื่อคุณได้รับ PPID (คอลัมน์ที่สอง) ของกระบวนการ Java ของคุณแล้วให้ใช้psอีกครั้งเพื่อค้นหากระบวนการที่เกี่ยวข้อง:

$ ps -p [PPID]

แก้ไข : หากพาเรนต์คือ 1 (init) ดังนั้นพาเรนต์แรกของกระบวนการ Java ของคุณจะเสียชีวิตหลังจาก "ให้กำเนิด" (น่าเศร้า) ด้วยเหตุนี้คุณจึงไม่สามารถใช้ลำดับชั้นกระบวนการปัจจุบันเพื่อค้นหาได้ ps -efสิ่งแรกที่ผมจะแนะนำให้คุณที่จะทำคือการตรวจสอบ คุณอาจพบผู้กระทำผิดเพียงแค่อ่านผลลัพธ์

จากนั้นดูที่ crontabs (คุณทำไปแล้ว แต่จะไม่เจ็บ):

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

สิ่งนี้จะต้องใช้สิทธิ์รูท

ยังไม่เห็นกำหนดการของกระบวนการ Java ใช่หรือไม่ แดงมัน ลองทำอย่างอื่นดู หากกระบวนการ Java ของคุณมีอยู่ตั้งแต่เริ่มระบบให้ดูที่โปรแกรม scheluded ณ เวลาบูต ฉันขอแนะนำบางอย่างเช่น ...

$ grep -iR java /etc/rc*

หากคุณยังไม่พบอะไรเลย ... ดีฉันยอมรับว่าฉันไม่มีความคิด คุณควรดูอีกครั้งps -efและค้นหากระบวนการที่เกี่ยวข้องกับโปรแกรมที่ใช้ Java คุณควรเจอดีมอนหรือ "ตัวเรียกใช้" ซึ่งรับผิดชอบกระบวนการตอบสนองอย่างต่อเนื่องของกระบวนการ Java ของคุณ


ฉันได้ลองค้นหากระบวนการหลักแล้ว แต่มันก็ชี้ไปที่ init (PPID = 1) ฉันจะแก้ไขคำถามด้วยข้อมูลนี้
Jose

@JoseChavez ถ้า PPID ของคุณเป็น 1 ดังนั้นกระบวนการ java ที่สร้างขึ้นนั้นเป็นกระบวนการซอมบี้ ตรวจสอบคำตอบได้ที่นี่
Ramesh

@JoseChavez ฉันแก้ไขคำตอบของฉันด้วยอีกสองสามเพลงเพื่อตรวจสอบในกรณีของคุณ
John WH Smith

2
@Ramesh หาก PPID คือ 1, พวกเขาอาจหรือไม่อาจจะเป็นซอมบี้ หากพวกเขาไม่ได้กลับกลายเป็นจริงโดยinitพวกเขาเป็นอย่างน้อยเด็กกำพร้า ตัวstateระบุที่psจะแสดงว่าเป็นซอมบี้ (เช่นps -eo pid,ppid,state,comm); Zรัฐจะ
goldilocks

1
@goldilocks: หาก PPID เป็น 1 พวกเขาไม่ใช่ซอมบี้ยกเว้นว่ากระบวนการเริ่มต้นทำงานผิดปกติ มันควรที่จะเรียกใช้ลูปการรอคอยซึ่งจะรวบรวมซอมบี้เด็กกำพร้าทั้งหมดทันที
hmakholm ออกเดินทางจากโมนิก้า

1

หากคุณไม่ทราบว่าใครเป็นผู้ปกครองคุณควรติดตามระบบบางอย่างเช่นauditd

คุณเปิดใช้งานการบันทึกด้วย:

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ระบุตัวตนของแม่ที่ดำเนินการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.