Làm thế nào để tìm nguồn của quá trình sinh sản?


12

Tôi có một quy trình Java chạy trên một cá thể RedHat Linux.

Vấn đề là nó cứ xuất hiện trở lại sau khi tôi giết nó. Tôi không chắc chắn nơi để tìm. Tôi đã đi đến crontab, nhưng không có may mắn.

Tôi đã xem PPID, nhưng nó chỉ ra init (1).

Bất kỳ ý tưởng làm thế nào tôi có thể tìm ra nguồn?


1
Bạn có thể cho chúng tôi một cái gì đó để tiếp tục? Có quá trình ghi vào bất kỳ tập tin ví dụ? Bạn có thể chỉ cho chúng tôi đầu ra của ps xfviệc hiển thị cây quy trình không? Khi nó đứng, chúng ta có rất ít để tiếp tục.
terdon

Bạn nói rằng bạn đã đến crontab ... Bạn cũng đã kiểm tra atxem có ai trong số họ là ai không?.
YoMismo

Bạn có thể cho chúng tôi biết phần mềm java nào bạn đang thực sự chạy. Tôi đã thấy các công cụ như Cassandra, thực sự có một bộ giám sát tích hợp trong một số thiết lập nhất định, chỉ kích hoạt một phiên bản khác của cơ sở dữ liệu sau khi phiên bản đầu tiên thất bại (không được dừng một cách duyên dáng).
Matthias Steinbauer

Câu trả lời:


15

Có một số khả năng (một số được đề cập trong các câu trả lời khác):

  1. Một hệ thống hoặc người dùng cronjob thực thi thường xuyên,
  2. Trong SysV init, một /etc/inittabmục nhập cho dịch vụ với respawnchỉ thị,
  3. Trong systemd, một tệp đơn vị với Restarttùy chọn được đặt thành một giá trị khác no,
  4. Trong Upstart, một tệp cấu hình dịch vụ với respawnchỉ thị,
  5. Một công cụ giám sát quá trình như monit, hoặc
  6. Một quy trình theo dõi đặc biệt cho dịch vụ cụ thể đó.

Một công cụ mới thú vị (chỉ dành cho linux) có thể cung cấp cái nhìn sâu sắc hơn về nơi quá trình đang được bắt đầu là sysdig .

Sysdig sử dụng các tính năng tracepoint của Linux Kernel để cung cấp số tiền cho hệ thống nhanh, rộng strace.

Ví dụ: nếu tôi muốn xem mọi quá trình bắt đầu ls, tôi có thể phát hành:

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

Khi lsđược chạy ở đâu đó, tôi sẽ nhận được một tin nhắn như thế này:

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

Tôi đã cắt bớt thông tin môi trường được trả về, nhưng như bạn có thể thấy, trong ptid tôi có thể thấy tên và pid của chương trình gọi execve. execvelà cuộc gọi hệ thống được sử dụng trong Linux được sử dụng để thực hiện các lệnh mới (tất cả các lệnh thực thi khác chỉ là tiền đề để thực thi).


2
sysdig là một lời khuyên tuyệt vời! BTW, tôi hiện đã có sẵn cho Windows (và Mac, tôi nghĩ) với chức năng hạn chế.
Neowizard

Làm thế nào để monit giúp ở đây? Tôi bắt đầu đọc qua hướng dẫn nhưng có vẻ như một sự thay thế hoặc sao lưu cho một cái gì đó giống như Nagios. Tôi không thấy nó sẽ giúp bạn theo dõi quá trình hồi sinh như thế nào.
Jefferson Hudson

7

Tôi tin rằng bạn có thể sử dụng pstree. Bạn có thể chỉ định lệnh là,

pstree -p PID

Ở trên sẽ cung cấp cho bạn một danh sách tất cả các phụ huynh của các ứng dụng java.


1
Điều này sẽ không giúp ích gì cả, vì OP đã nói rằng ông đã xem PPID, đó là 1.
Guntram Blohm hỗ trợ Monica

@GuntramBlohm, vui lòng xem câu hỏi ban đầu trước khi nó được chỉnh sửa. Nó không được đề cập trong phiên bản đầu tiên của câu hỏi.
Ramesh

2
thở dài. Một người đăng khác đặt câu hỏi của mình thành mục tiêu di động mà không đánh dấu các chỉnh sửa của mình :(
Guntram Blohm hỗ trợ Monica

5

Bạn có thể xem PPID của nó (ID tiến trình gốc):

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

Khi bạn đã có PPID (cột thứ hai) của quy trình Java, hãy sử dụng pslại để tìm quy trình liên quan:

$ ps -p [PPID]

Chỉnh sửa : nếu cha mẹ là 1 (init), thì cha mẹ đầu tiên của quá trình Java của bạn đã chết ngay sau khi "sinh con" (thật đáng buồn). Do đó, bạn không thể sử dụng hệ thống phân cấp quy trình hiện tại để tìm thấy nó. Điều đầu tiên tôi khuyên bạn nên làm là kiểm tra ps -ef. Bạn có thể tìm ra thủ phạm chỉ bằng cách đọc đầu ra.

Sau đó, hãy xem crontabs (bạn đã làm rồi, nhưng nó sẽ không đau):

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

Điều này sẽ yêu cầu quyền root.

Vẫn không thể thấy một quy trình Java được lên lịch? Đằng đó. Hãy thử một cái gì đó khác. Nếu quy trình Java của bạn có mặt kể từ khi khởi động, hãy xem các chương trình được lập trình lúc khởi động. Tôi sẽ đề nghị một cái gì đó như ...

$ grep -iR java /etc/rc*

Nếu bạn vẫn không thể tìm thấy bất cứ điều gì thì ... Tôi thừa nhận tôi đang cạn kiệt ý tưởng. Bạn thực sự cần có cái nhìn khác ps -efvà định vị các quy trình liên quan đến các chương trình dựa trên Java. Bạn sẽ bắt gặp một trình nền, hoặc một "trình khởi chạy", chịu trách nhiệm cho sự hồi sinh liên tục của quy trình Java của bạn.


Tôi đã thử tra cứu tiến trình cha mẹ, nhưng nó chỉ trỏ tới init (PPID = 1). Tôi sẽ sửa đổi câu hỏi với thông tin này.
Jose

@JoseChavez, nếu PPID của bạn là 1, thì các quy trình java đang được tạo là các quy trình zombie. Kiểm tra câu trả lời ở đây .
Ramesh

@JoseChavez Tôi đã chỉnh sửa câu trả lời của mình với một vài bài hát để điều tra trong trường hợp của bạn.
John WH Smith

2
@Ramesh Nếu PPID là 1, chúng có thể hoặc không thể là zombie . Nếu chúng không thực sự được sinh ra bởi init, chúng ít nhất là trẻ mồ côi . Trình statexác định pssẽ hiển thị nếu chúng là zombie (ví dụ ps -eo pid,ppid,state,comm:); nhà nước sẽ được Z.
goldilocks

1
@goldilocks: Nếu PPID là 1, chúng không phải là zombie , trừ khi quá trình init bị trục trặc; nó nên chạy một vòng chờ đợi để gặt hái tất cả zombie mồ côi ngay lập tức.
hmakholm còn lại của Monica

1

Nếu bạn không biết ai là cha mẹ, bạn nên theo dõi một số hệ thống như Audd

bạn cho phép đăng nhập bằng:

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

và sau đó /var/log/audit/audit.logtìm dòng như:

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)

(chia thành nhiều dòng để dễ đọc). Bạn quan tâm exe="/bin/dash"và / hoặc pid=18182xác định quá trình chia sẻ của bạn mà bạn muốn tìm và ppid=17176xác định cha mẹ đã thực hiện nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.