산란 과정의 출처를 찾는 방법은 무엇입니까?

산란 과정의 출처를 찾는 방법은 무엇입니까?

RedHat Linux 인스턴스에서 Java 프로세스가 실행되고 있습니다.

문제는 죽인 후에도 다시 나타난다는 것입니다. 어디를 봐야할지 모르겠습니다. 나는 crontab에 갔지만 운이 없습니다.

PPID를 살펴봤지만 초기화(1)를 가리키고 있습니다.

소스를 찾는 방법을 아시나요?

답변1

몇 가지 가능성이 있습니다 (일부는 다른 답변에서 언급됨).

  1. 자주 실행되는 시스템 또는 사용자 cronjob,
  2. SysV init에서 지시어가 포함된 /etc/inittab서비스 항목 respawn,
  3. systemd에서는 유닛 파일 Restart옵션이 no,
  4. Upstart에서는 지시어가 포함된 서비스 구성 파일 respawn,
  5. 프로세스 모니터링 도구(예:monit, 또는
  6. 이 특정 서비스에 대한 임시 감시 프로세스입니다.

흥미로운 새 도구(Linux에만 해당)는 프로세스가 시작된 위치에 대한 추가 정보를 제공할 수 있습니다.시스템 마이닝.

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에는 execve를 호출한 프로그램의 이름과 pid가 보이네요. execve새로운 명령을 실행하는 데 Linux의 시스템 호출이 사용됩니까(다른 모든 exec 호출은 execve에 대한 프런트엔드일 뿐입니다).

답변2

나는 당신이 그것을 사용할 수 있다고 믿습니다 pstree. 명령을 다음과 같이 지정할 수 있습니다.

pstree -p PID

위의 내용은 Java 애플리케이션의 모든 상위 목록을 제공합니다.

답변3

해당 PPID(상위 프로세스 ID)를 볼 수 있습니다.

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

Java 프로세스(두 번째 열)의 PPID가 있으면 ps이를 다시 사용하여 관련 프로세스를 찾습니다.

$ ps -p [PPID]

편집하다: 부모가 1(초기화)이면첫 번째Java 프로세스의 상위 프로세스는 "출산" 후에 종료됩니다(슬프네요). 따라서 현재 프로세스 계층 구조를 사용하여 찾을 수 없습니다. 제가 추천하는 첫 번째 일은 확인하는 것입니다 ps -ef. 출력 내용만 읽어도 범인을 찾을 수 있습니다.

그 다음에,크론탭을 보세요(이미 수행했지만 해롭지는 않습니다):

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

이를 위해서는 루트 권한이 필요합니다.

아직도 예약된 Java 프로세스를 볼 수 없나요? 젠장. 다른 것을 시도해 봅시다. 시작 이후 Java 프로세스가 존재했다면 시작 시 예약된 프로그램을 살펴보세요. 나는 다음과 같은 것을 제안하고 싶습니다 ...

$ grep -iR java /etc/rc*

그래도 아무것도 찾을 수 없다면...글쎄, 아이디어가 부족하다는 점을 인정합니다. 실제로 다시 한 번 살펴보고 ps -efJava 기반 프로그램과 관련된 프로세스를 찾아야 합니다. Java 프로세스를 지속적으로 다시 생성하는 데몬 또는 "스타터"를 만나야 합니다.

답변4

부모가 누구인지 모르는 경우 다음과 같은 시스템 추적기를 사용해야 합니다.심사

다음 명령을 사용하여 로깅을 활성화할 수 있습니다.

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=18182ppid=17176

관련 정보