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?
ps xf
wyświetlania drzewa procesów? W tej chwili mamy bardzo niewiele do zrobienia.at
czy któryś z nich jest tym?Odpowiedzi:
Istnieje wiele możliwości (niektóre wymienione w innych odpowiedziach):
/etc/inittab
wpis dotyczący usługi zrespawn
dyrektywą,Restart
opcją ustawioną na wartość inną niżno
,respawn
dyrektywą,monit
lubCiekawym 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ć:Kiedy
ls
gdzieś zostanie uruchomiony, otrzymam taki komunikat:Obciąłem zwrócone informacje o środowisku, ale jak widać, w ptid widzę nazwę i pid programu wywołującego execve.
execve
to wywołanie systemowe używane w Linuksie, używane do wykonywania nowych poleceń (wszystkie inne wywołania exec są tylko frontendami do wykonania).źródło
Wierzę, że możesz użyć
pstree
. Możesz określić polecenie jakoPowyżej otrzymasz listę wszystkich rodziców aplikacji Java.
źródło
Możesz zobaczyć jego identyfikator PPID (identyfikator procesu nadrzędnego):
Po uzyskaniu PPID (druga kolumna) procesu Java, użyj
ps
ponownie, aby znaleźć powiązany proces: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):
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 ...
Jeśli nadal nie możesz niczego znaleźć, to przyznaję, że brakuje mi pomysłów. Powinieneś naprawdę rzucić okiem
ps -ef
i 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.źródło
init
, są przynajmniej sierotami .state
Specifier sięps
pokaże, czy są zombie (npps -eo pid,ppid,state,comm
); stan będzieZ
.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ą:
a następnie w
/var/log/audit/audit.log
liniach wyszukiwania takich jak:(podzielone na wiele linii dla czytelności). Interesujesz się
exe="/bin/dash"
i / lubpid=18182
identyfikujesz proces rouge, którego chcesz szukać, ippid=17176
który rodzic, który go wykonał.źródło