Bagaimana menemukan sumber proses pemijahan?

12

Saya memiliki proses Java yang berjalan pada contoh RedHat Linux.

Masalahnya adalah ia terus muncul kembali setelah saya membunuhnya. Saya tidak yakin ke mana harus mencari. Saya sudah pergi ke crontab, tetapi tidak berhasil.

Saya telah melihat PPID, tetapi menunjuk ke init (1).

Adakah yang bisa saya ketahui sumbernya?

Jose
sumber
1
Bisakah Anda memberi kami sesuatu untuk terus berlanjut? Apakah proses menulis ke file apa saja misalnya? Bisakah Anda menunjukkan kepada kami hasil dari ps xfmemperlihatkan pohon proses? Seperti berdiri, kita memiliki sangat sedikit untuk melanjutkan.
terdon
Anda bilang Anda pergi ke crontab ... Apakah Anda juga memeriksa atuntuk melihat apakah ada yang itu?
YoMismo
Bisakah Anda memberi tahu kami apa perangkat lunak java yang sebenarnya Anda jalankan. Saya telah melihat alat-alat seperti Cassandra, yang benar-benar memiliki pengawas built-in dalam pengaturan tertentu yang hanya menjalankan contoh lain dari database setelah contoh pertama gagal (tidak dihentikan dengan anggun).
Matthias Steinbauer

Jawaban:

15

Ada sejumlah kemungkinan (beberapa disebutkan dalam jawaban lain):

  1. Suatu sistem atau pengguna yang sering melakukan cronjob,
  2. Dalam SysV init, /etc/inittabentri untuk layanan dengan respawnarahan,
  3. Dalam systemd, file unit dengan Restartopsi diatur ke nilai selain no,
  4. Di pemula, file konfigurasi layanan dengan respawnarahan,
  5. Alat pemantauan proses seperti monit, atau
  6. Proses pengawas ad-hoc untuk layanan tertentu.

Alat baru (khusus linux) yang menarik yang dapat memberikan lebih banyak wawasan tentang di mana proses dimulai adalah sysdig .

Sysdig menggunakan fitur tracepoint Kernel Linux untuk memberikan jumlah yang cepat, sistem yang luas strace.

Misalnya, jika saya ingin melihat setiap proses dimulai ls, saya dapat mengeluarkan:

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

Ketika lsdijalankan di suatu tempat, saya akan mendapatkan pesan seperti ini:

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

Saya memotong informasi lingkungan yang dikembalikan, tetapi seperti yang Anda lihat, di PTT saya dapat melihat nama dan pid dari program yang memanggil execve. execveadalah panggilan sistem yang digunakan di Linux yang digunakan untuk mengeksekusi perintah baru (semua panggilan exec lainnya hanya antarmuka untuk mengeksekusi).

Steven D
sumber
2
sysdig adalah saran yang bagus! BTW, sekarang tersedia untuk Windows (dan Mac, saya pikir) dengan fungsi terbatas.
Neowizard
Bagaimana monit membantu di sini? Saya mulai membaca manual tetapi sepertinya alternatif atau cadangan untuk sesuatu seperti Nagios. Saya tidak melihat bagaimana ini akan membantu Anda melacak proses respawning.
Jefferson Hudson
7

Saya yakin Anda bisa menggunakannya pstree. Anda dapat menentukan perintah sebagai,

pstree -p PID

Di atas akan memberi Anda daftar semua orang tua dari aplikasi java.

Ramesh
sumber
1
Ini tidak akan membantu sama sekali, karena OP sudah mengatakan dia melihat PPID, yaitu 1.
Guntram Blohm mendukung Monica
@GuntramBlohm, silakan lihat pertanyaan asli sebelum diedit. Itu tidak disebutkan dalam versi pertama pertanyaan.
Ramesh
2
mendesah. Poster lain yang menjadikan pertanyaannya sebagai target yang bergerak tanpa menandai hasil editnya :(
Guntram Blohm mendukung Monica
5

Anda dapat melihat PPID-nya (ID proses induk):

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

Setelah Anda mendapatkan PPID (kolom kedua) dari proses Java Anda, gunakan pslagi untuk menemukan proses terkait:

$ ps -p [PPID]

Sunting : jika orang tua adalah 1 (init), maka orang tua pertama dari proses Java Anda meninggal tepat setelah "melahirkan" (betapa sedihnya). Karena itu, Anda tidak dapat menggunakan hierarki proses saat ini untuk menemukannya. Hal pertama yang saya sarankan Anda lakukan adalah memeriksa ps -ef. Anda mungkin menemukan pelakunya hanya dengan membaca hasilnya.

Kemudian, lihatlah crontab (Anda sudah melakukannya, tetapi tidak sakit):

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

Ini akan membutuhkan hak akses root.

Masih tidak dapat melihat proses Java dijadwalkan? Sial. Mari kita coba yang lain. Jika proses Java Anda ada sejak boot, lihatlah program yang sudah skelud pada saat boot. Saya akan menyarankan sesuatu seperti ...

$ grep -iR java /etc/rc*

Jika Anda masih tidak dapat menemukan apa pun maka ... Yah saya akui saya kehabisan ide. Anda harus benar-benar melihat lagi ps -ef, dan mencari proses yang terkait dengan program berbasis Java. Anda harus menemukan sebuah daemon, atau "peluncur", yang bertanggung jawab untuk respawning terus-menerus dari proses Java Anda.

John WH Smith
sumber
Saya sudah mencoba mencari proses induk, tetapi hanya menunjuk ke init (PPID = 1). Saya akan mengubah pertanyaan dengan info ini.
Jose
@ JoseChavez, jika PPID Anda adalah 1, maka proses java yang sedang dibuat adalah proses zombie. Periksa jawaban ini di sini .
Ramesh
@ JoseChavez Saya mengedit jawaban saya dengan beberapa lagu lagi untuk menyelidiki dalam kasus Anda.
John WH Smith
2
@Ramesh Jika PPID adalah 1, mereka mungkin atau mungkin tidak menjadi zombie . Jika mereka tidak benar-benar melahirkan init, mereka setidaknya anak yatim . The statespecifier untuk psakan menunjukkan jika mereka zombie (misalnya, ps -eo pid,ppid,state,comm); negara akan Z.
goldilocks
1
@goldilocks: Jika PPID adalah 1, mereka bukan zombie , kecuali jika proses init tidak berfungsi; itu harus menjalankan loop menunggu yang menuai semua zombie yatim segera.
hmakholm tersisa Monica
1

Jika Anda tidak tahu siapa orang tuanya, Anda harus mencari pelacak sistem seperti auditd

Anda akan mengaktifkan pencatatan dengan:

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

dan kemudian di /var/log/audit/audit.logtemukan baris seperti:

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)

(Dipecah menjadi beberapa baris untuk readibility). Anda tertarik exe="/bin/dash"dan / atau pid=18182mengidentifikasi proses pemerah pipi yang ingin Anda cari, dan ppid=17176yang mengidentifikasi induk mana yang mengeksekusinya.

Matija Nalis
sumber