RedHat Linux 인스턴스에서 Java 프로세스를 실행하고 있습니다.
문제는 내가 죽인 후에도 계속 다시 나타납니다. 어디서 볼지 잘 모르겠습니다. 나는 이미 crontab에 갔지만 운이 없다.
PPID를 살펴 봤지만 init (1)를 가리 킵니다.
소스를 어떻게 찾을 수 있습니까?
at
그 중 하나가 있는지?
RedHat Linux 인스턴스에서 Java 프로세스를 실행하고 있습니다.
문제는 내가 죽인 후에도 계속 다시 나타납니다. 어디서 볼지 잘 모르겠습니다. 나는 이미 crontab에 갔지만 운이 없다.
PPID를 살펴 봤지만 init (1)를 가리 킵니다.
소스를 어떻게 찾을 수 있습니까?
at
그 중 하나가 있는지?
답변:
여러 가지 가능성이 있습니다 (일부 답변에서 언급).
/etc/inittab
에서 respawn
지시문이 있는 서비스 항목Restart
이 아닌 다른 값으로 옵션을 설정 no
,respawn
지시문이 있는 서비스 구성 파일monit
또는프로세스가 시작되는 위치에 대한 더 많은 통찰력을 제공 할 수있는 흥미로운 새 (Linux 전용) 도구는 sysdig 입니다.
Sysdig는 Linux Kernel의 추적 점 기능을 사용하여 시스템 전체에 필요한 양을 제공합니다 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에서 사용되는 시스템 호출입니다 (다른 모든 실행 호출은 실행을위한 프론트 엔드 일 뿐임).
당신이 사용할 수 있다고 생각합니다 pstree
. 명령을 다음과 같이 지정할 수 있습니다.
pstree -p PID
위의 내용은 Java 응용 프로그램의 모든 부모 목록을 제공합니다.
PPID (부모 프로세스 ID)를 살펴볼 수 있습니다.
$ ps -eo pid,ppid,args | grep java
Java 프로세스의 PPID (두 번째 열)를 얻은 후에는 ps
다시 사용 하여 관련 프로세스를 찾으십시오.
$ ps -p [PPID]
편집 : 부모가 1 (init) 인 경우 Java 프로세스 의 첫 번째 부모는 "출산"직후에 사망했습니다 (얼마나 슬프습니까). 따라서 현재 프로세스 계층 구조를 사용하여 찾을 수 없습니다. 가장 먼저해야 할 일은 확인하는 것 ps -ef
입니다. 출력을 읽는 것만으로도 범인을 찾을 수 있습니다.
그런 다음 crontab을 살펴보십시오 (이미 수행했지만 아프지 않습니다).
$ 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
state
ps
ps -eo pid,ppid,state,comm
Z
당신은 부모가 누구인지 알 수없는 경우, 당신은 당신에게 같은 일부 시스템 추적해야 인 auditd을
다음을 사용하여 로깅을 활성화합니다.
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
입니다.
ps xf
프로세스 트리 를 보여준 결과를 보여줄 수 있습니까 ? 그대로, 우리는 계속할 것이 거의 없습니다.