Jak znaleźć źródło procesu odradzania?

12

Mam proces Java działający na instancji RedHat Linux.

Problem polega na tym, że pojawia się ponownie po tym, jak go zabiję. Nie jestem pewien, gdzie szukać. Już poszedłem na crontab, ale bez powodzenia.

Patrzyłem na PPID, ale wskazuje on na init (1).

Masz pomysł, jak mogę znaleźć źródło?

Jose
źródło
1
Czy możesz dać nam coś do zrobienia? Czy proces zapisuje na przykład jakieś pliki? Czy możesz nam pokazać wynik ps xfwyświetlania drzewa procesów? W tej chwili mamy bardzo niewiele do zrobienia.
terdon
Powiedziałeś, że poszedłeś na crontab ... Czy sprawdziłeś również, atczy któryś z nich jest tym?
YoMismo
Czy możesz nam powiedzieć, jakie oprogramowanie Java faktycznie używasz. Widziałem narzędzia takie jak Cassandra, które faktycznie mają wbudowany watchdog w niektórych konfiguracjach, który po prostu uruchamia inną instancję bazy danych, gdy pierwsza instancja uległa awarii (nie została z gracją zatrzymana).
Matthias Steinbauer

Odpowiedzi:

15

Istnieje wiele możliwości (niektóre wymienione w innych odpowiedziach):

  1. Często wykonywany cronjob systemu lub użytkownika,
  2. W SysV init /etc/inittabwpis dotyczący usługi z respawndyrektywą,
  3. W systemd: plik jednostkowy z Restartopcją ustawioną na wartość inną niż no,
  4. W Upstart: plik konfiguracji usługi z respawndyrektywą,
  5. Narzędzie do monitorowania procesu, takie jak monitlub
  6. Proces nadzorczy ad hoc dla tej konkretnej usługi.

Ciekawym nowym narzędziem (tylko linux), które może zapewnić lepszy wgląd w to, gdzie rozpoczyna się proces, jest sysdig .

Sysdig korzysta z funkcji tracepoint jądra Linuksa, aby zapewnić szybki, ogólnosystemowy system strace.

Na przykład, jeśli chcę zobaczyć rozpoczęcie każdego procesu ls, mogę wydać:

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

Kiedy lsgdzieś zostanie uruchomiony, otrzymam taki komunikat:

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

Obciąłem zwrócone informacje o środowisku, ale jak widać, w ptid widzę nazwę i pid programu wywołującego execve. execveto wywołanie systemowe używane w Linuksie, używane do wykonywania nowych poleceń (wszystkie inne wywołania exec są tylko frontendami do wykonania).

Steven D.
źródło
2
sysdig to świetna rada! BTW, jest teraz dostępny dla Windows (i Mac, jak sądzę) z ograniczoną funkcjonalnością.
Neowizard,
W jaki sposób monitor pomaga tutaj? Zacząłem czytać instrukcję, ale wygląda ona na alternatywę lub kopię zapasową czegoś takiego jak Nagios. Nie rozumiem, jak pomogłoby ci to wyśledzić proces odradzania.
Jefferson Hudson
7

Wierzę, że możesz użyć pstree. Możesz określić polecenie jako

pstree -p PID

Powyżej otrzymasz listę wszystkich rodziców aplikacji Java.

Ramesh
źródło
1
To wcale nie pomoże, ponieważ OP już powiedział, że spojrzał na PPID, który wynosi 1.
Guntram Blohm popiera Monikę
@GuntramBlohm, spójrz na oryginalne pytanie przed jego edycją. Nie wspomniano o tym w pierwszej wersji pytania.
Ramesh
2
westchnienie. Kolejny plakat, który sprawia, że jego pytanie ruchomy cel bez oznakowania jego edycje :(
Guntram Blohm obsługuje Monica
5

Możesz zobaczyć jego identyfikator PPID (identyfikator procesu nadrzędnego):

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

Po uzyskaniu PPID (druga kolumna) procesu Java, użyj psponownie, aby znaleźć powiązany proces:

$ ps -p [PPID]

Edycja : jeśli rodzic ma 1 (init), to pierwszy rodzic twojego procesu Java zmarł zaraz po „porodzie” (jak smutno). Z tego powodu nie można użyć bieżącej hierarchii procesów do jej znalezienia. Pierwszą rzeczą, którą poleciłbym ci zrobić, jest sprawdzenie ps -ef. Możesz znaleźć winowajcę po prostu czytając dane wyjściowe.

Następnie spójrz na crontabs (już to zrobiłeś, ale nie będzie bolało):

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

Będzie to wymagało uprawnień roota.

Nadal nie widzisz zaplanowanego procesu Java? Cholera. Spróbujmy czegoś innego. Jeśli Twój proces Java jest obecny od momentu uruchomienia, spójrz na programy zestrojone podczas uruchamiania. Sugerowałbym coś takiego ...

$ grep -iR java /etc/rc*

Jeśli nadal nie możesz niczego znaleźć, to przyznaję, że brakuje mi pomysłów. Powinieneś naprawdę rzucić okiem ps -efi zlokalizować procesy związane z programami opartymi na Javie. Powinieneś natknąć się na demona lub „program uruchamiający”, odpowiedzialny za ciągłe odrodzenie procesu Java.

John WH Smith
źródło
Próbowałem wyszukać proces nadrzędny, ale wskazuje on tylko na init (PPID = 1). Zmodyfikuję pytanie za pomocą tych informacji.
Jose
@JoseChavez, jeśli Twój PPID ma wartość 1, tworzone procesy Java są procesami zombie. Sprawdź tę odpowiedź tutaj .
Ramesh
@JoseChavez Zredagowałem swoją odpowiedź, dodając jeszcze kilka ścieżek do zbadania w twoim przypadku.
John WH Smith
2
@Ramesh Jeśli PPID ma wartość 1, mogą być lub nie być zombie . Jeśli tak naprawdę nie zostały odrodzone init, są przynajmniej sierotami . stateSpecifier się pspokaże, czy są zombie (np ps -eo pid,ppid,state,comm); stan będzie Z.
goldilocks
1
@Goldilocks: Jeśli PPID ma wartość 1, nie są one zombie , chyba że proces init działa nieprawidłowo; powinien uruchomić pętlę oczekiwania, która natychmiast zbierze wszystkie osierocone zombie.
hmakholm opuścił Monikę
1

Jeśli nie wiesz, kto jest rodzicem, powinieneś skorzystać z narzędzia do śledzenia systemu, takiego jak auditd

możesz włączyć rejestrowanie za pomocą:

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

a następnie w /var/log/audit/audit.logliniach wyszukiwania takich jak:

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)

(podzielone na wiele linii dla czytelności). Interesujesz się exe="/bin/dash"i / lub pid=18182identyfikujesz proces rouge, którego chcesz szukać, i ppid=17176który rodzic, który go wykonał.

Matija Nalis
źródło