Yumurtlama sürecinin kaynağı nasıl bulunur?


12

RedHat Linux örneğinde çalışan bir Java işlemi var.

Sorun, onu öldürdükten sonra tekrar ortaya çıkması. Nereye bakacağımdan emin değilim. Zaten crontab'a gittim, ama şans yok.

PPID'ye baktım, ancak init'e işaret ediyor (1).

Kaynağı nasıl bulacağım hakkında bir fikrin var mı?


1
Bize devam etmemiz için bir şeyler verebilir misiniz? İşlem örneğin herhangi bir dosyaya yazıyor mu? ps xfProses ağacını göstermenin çıktısını gösterebilir misiniz ? Durduğu gibi, devam edecek çok az şeyimiz var.
terdon

Crontab'a gittin dedin ... atBunlardan birinin olup olmadığını da kontrol ettin mi?
YoMismo

Hangi java yazılımını çalıştırdığınızı söyleyebilir misiniz? Cassandra gibi, aslında ilk kurulum başarısız olduğunda (zarif bir şekilde durdurulmadı) veritabanının başka bir örneğini ateşleyen bazı kurulumlarda yerleşik bir bekçi köpeği gördüm.
Matthias Steinbauer

Yanıtlar:


15

Birkaç olasılık vardır (bazıları diğer cevaplarda belirtilmiştir):

  1. Sık sık çalışan bir sistem veya kullanıcı cronjob,
  2. SysV init'te yönerge /etc/inittabile hizmet için bir giriş respawn,
  3. Systemd'de, Restartseçeneği dışında bir değere ayarlanmış bir birim dosyası no,
  4. Upstart'da, respawnyönerge içeren bir hizmet yapılandırma dosyası ,
  5. monitVeya gibi bir işlem izleme aracı
  6. Söz konusu hizmet için geçici bir izleme işlemi.

Sürecin başladığı yer hakkında daha fazla bilgi sağlayabilecek ilginç bir yeni (yalnızca linux) aracı sysdig .

Sysdig, Linux Kernel'in izleme noktası özelliklerini, sistem çapında hızlı ve etkili bir değer sağlamak için kullanır strace.

Örneğin, her sürecin başladığını görmek lsistersem, şunu verebilirim:

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

Bir lsyerde çalıştırıldığında, böyle bir mesaj alırım:

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=...

Döndürülen ortam bilgilerini kısalttım, ancak gördüğünüz gibi, ptid'de execute çağrılan programın adını ve pid'ini görebiliyorum. execveLinux'ta yeni komutları yürütmek için kullanılan sistem çağrısıdır (diğer tüm yürütme çağrıları yürütmek için yalnızca ön uçlardır).


2
sysdig harika bir tavsiye! BTW, şimdi sınırlı işlevsellik ile Windows (ve Mac, sanırım) için kullanılabilir.
Neowizard

Monit burada nasıl yardımcı oluyor? El kitabını okumaya başladım, ancak Nagios gibi bir şeye alternatif veya yedek gibi görünüyor. Yeniden doğma sürecini izlemenize nasıl yardımcı olacağını görmüyorum.
Jefferson Hudson

7

Kullanabileceğine inanıyorum pstree. Komutu şu şekilde belirtebilirsiniz:

pstree -p PID

Yukarıdakiler, java uygulamalarının tüm ebeveynlerinin bir listesini verecektir.


1
OP zaten 1 olan PPID'ye baktığını söylediği için bu hiç yardımcı olmayacak.
Guntram Blohm, Monica'yı

@GuntramBlohm, lütfen düzenlenmeden önce orijinal soruya bakın. Sorunun ilk versiyonunda bahsedilmedi.
Ramesh

2
iç çekmek.
Sorusunu

5

PPID'sine (üst işlem kimliği) bir göz atabilirsiniz:

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

Java işleminizin PPID'sini (ikinci sütun) aldıktan sonra ps, ilişkili işlemi bulmak için tekrar kullanın:

$ ps -p [PPID]

Düzenleme : üst öğe 1 (init) ise, Java işleminizin ilk üst öğesi "doğum" işleminden hemen sonra (ne kadar üzücü) öldü. Bu nedenle, onu bulmak için geçerli işlem hiyerarşisini kullanamazsınız. Yapmanızı tavsiye ettiğim ilk şey kontrol etmektir ps -ef. Suçluyu sadece çıktıyı okuyarak bulabilirsiniz.

Ardından, crontabs'a bir göz atın (zaten yaptınız, ama acıtmayacak):

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

Bunun için kök ayrıcalıkları gerekir.

Hala planlanmış bir Java işlemi göremiyor musunuz? Lanet olsun. Başka bir şey deneyelim. Java işleminiz önyüklemeden beri varsa, önyükleme sırasında programlanan programlara göz atın. Şöyle bir şey öneririm ...

$ grep -iR java /etc/rc*

Hâlâ bir şey bulamazsan ... Kabul ediyorum ki fikirlerim bitiyor. ps -efJava tabanlı programlarla ilişkili işlemlere gerçekten bir göz atmalı ve bulmalısınız. Java işleminizin sürekli yeniden doğmasından sorumlu bir arka plan programına veya bir "başlatıcıya" rastlamanız gerekir.


Ben üst süreci ararken denedim, ama sadece init (PPID = 1) işaret ediyor. Soruyu bu bilgilerle değiştireceğim.
Jose

@JoseChavez, PPID'niz 1 ise, oluşturulan java işlemleri zombi süreçleridir. Bu cevabı buradan kontrol edin .
Ramesh

@JoseChavez Cevabınızı araştırmak için cevabımı birkaç parça daha düzenledim.
John WH Smith

2
PPID'nin 1 ise, bunlar olabilir @Ramesh veya olmayabilir olmak zombiler . Eğer onlar tarafından doğmamışlarsa init, en azından yetimlerdirler . stateİçin belirteci psonlar zombi olup olmadığını gösterecektir (örneğin ps -eo pid,ppid,state,comm); devlet olacak Z.
goldilocks

1
@goldilocks: PPID 1 ise , başlatma işlemi hatalı olmadıkça zombiler değildir ; tüm yetim zombileri hemen toplayan bir bekleme döngüsü çalıştırmalıdır.
hmakholm Monica

1

Ebeveynin kim olduğunu bilmiyorsanız, auditd gibi bir sistem izleyicisi olmalısınız

aşağıdakilerle günlüğe kaydetmeyi etkinleştirirsiniz:

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

ve sonra aşağıdaki /var/log/audit/audit.loggibi satırları bulun:

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)

(okunabilirlik için birden çok satıra bölünür). İlgilendiğiniz exe="/bin/dash"ve / veya pid=18182aramak istediğiniz allık işleminizi ve ppid=17176hangisinin yürüttüğünü gösteren ebeveyni tanımlarsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.