Як знайти джерело процесу нересту?


12

У мене процес Java працює на екземплярі RedHat Linux.

Проблема полягає в тому, що вона знову з'являється після того, як я її вбиваю. Я не впевнений, куди шукати. Я вже пішов на кронтаб, але не пощастило.

Я подивився на PPID, але він вказує на init (1).

Будь-яка ідея, як я можу дізнатися джерело?


1
Ви можете дати нам щось продовжити? Чи записує процес до файлів, наприклад? Чи можете ви показати нам результат ps xfпоказу дерева процесів? На даний момент нам залишається дуже мало.
тердон

Ви сказали, що пішли на crontab ... Ви також перевіряли, atчи є хтось із них?
YoMismo

Чи можете ви сказати нам, яке програмне забезпечення java ви насправді працює. Я бачив такі інструменти, як Кассандра, які насправді мають вбудований сторожовий дог в певних установках, який просто запускає інший екземпляр бази даних, коли перший екземпляр не вдався (витончено не зупинився).
Маттіас Штайнбауер

Відповіді:


15

Існує ряд можливостей (деякі з них згадуються в інших відповідях):

  1. Система або користувальницька робота виконує часто,
  2. У SysV init - /etc/inittabзапис про послугу з respawnдирективою,
  3. У системному файлі одиниці з Restartопцією встановлено значення, відмінне від no,
  4. У Upstart - файл конфігурації служби з respawnдирективою,
  5. Інструмент моніторингу процесів, такий як monit, або
  6. Спеціальний процес сторожової служби для даної послуги.

Цікавим новим (лише для Linux) інструментом, який міг би отримати більше уявлення про те, де процес запускається, - sysdig .

Sysdig використовує функції слідування точок ядра Linux, щоб забезпечити швидкий, системний показник 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, який використовується для виконання нових команд (усі інші виклики exec - це лише межі для виконання)


2
sysdig - чудова порада! До речі, тепер він доступний для Windows (і Mac, я думаю) з обмеженою функціональністю.
Neowizard

Як моніт допомагає тут? Я почав читати посібник, але це виглядає як альтернатива або резервне копіювання чогось типу Nagios. Я не бачу, як це допоможе вам відстежити процес відновлення.
Джефферсон Хадсон

7

Я вважаю, ви могли б скористатися pstree. Ви можете вказати команду як:

pstree -p PID

Наведене вище дасть вам список усіх батьків програм Java.


1
Це зовсім не допоможе, оскільки в ОП вже сказали, що він подивився на PPID, який є 1.
Гунтрам Блом підтримує Моніку

@GuntramBlohm, будь ласка, подивіться на оригінальне запитання до його редагування. Про це не згадували в першій версії питання.
Рамеш

2
зітхати. Ще один плакат, який робить його питання рухомою ціллю, не відзначаючи його правки :(
Гунтрам Блом підтримує Моніку

5

Ви можете подивитися на його PPID (ідентифікатор батьківського процесу):

$ 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 присутній з часу завантаження, подивіться на програми, складені під час завантаження. Я б запропонував щось на зразок ...

$ grep -iR java /etc/rc*

Якщо ви все ще нічого не можете знайти ... Ну, я визнаю, мені не вистачає ідей. Вам дійсно слід по-іншому переглянути ps -efі знайти процеси, пов'язані з програмами на базі Java. Вам слід натрапити на демона або "пускового пристрою", відповідального за постійне переростання вашого Java-процесу.


Я намагався шукати батьківський процес, але він просто вказує на init (PPID = 1). Я зміню питання з цією інформацією.
Хосе

@JoseChavez, якщо ваш PPID дорівнює 1, то Java-процеси, які створюються, - це процеси зомбі. Перевірте цю відповідь тут .
Рамеш

@JoseChavez Я відредагував свою відповідь ще кількома слідами, щоб розслідувати вашу справу.
Джон У. Сміт

2
@Ramesh Якщо PPID дорівнює 1, вони можуть бути або не бути зомбі . Якщо вони насправді не були породжені init, вони є принаймні сиротами . Специфікатор stateдля psпоказу покаже, чи вони зомбі (наприклад, ps -eo pid,ppid,state,comm); держава буде Z.
goldilocks

1
@goldilocks: Якщо PPID дорівнює 1, вони не є зомбі , якщо тільки процес init не працює; слід запустити цикл очікування, який негайно пожинає всіх осирілих зомбі.
hmakholm залишився над Монікою

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.