스폰 프로세스의 소스를 찾는 방법은 무엇입니까?


12

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

문제는 내가 죽인 후에도 계속 다시 나타납니다. 어디서 볼지 잘 모르겠습니다. 나는 이미 crontab에 갔지만 운이 없다.

PPID를 살펴 봤지만 init (1)를 가리 킵니다.

소스를 어떻게 찾을 수 있습니까?


1
계속 진행할 수있는 것이 있습니까? 프로세스가 예를 들어 파일에 쓰나요? ps xf프로세스 트리 를 보여준 결과를 보여줄 수 있습니까 ? 그대로, 우리는 계속할 것이 거의 없습니다.
terdon

당신은 당신이 당신은 또한 확인 했 ... crontab에 갔다했다 at그 중 하나가 있는지?
YoMismo

실제로 실행중인 Java 소프트웨어를 알려주십시오. Cassandra와 같은 도구를 보았습니다. 실제로 특정 설정에 내장 감시 기능이있어 첫 번째 인스턴스가 실패하면 데이터베이스의 다른 인스턴스를 시작합니다 (정상적으로 중지되지 않았습니다).
Matthias Steinbauer 8

답변:


15

여러 가지 가능성이 있습니다 (일부 답변에서 언급).

  1. 자주 실행되는 시스템 또는 사용자 크론 작업
  2. SysV init /etc/inittab에서 respawn지시문이 있는 서비스 항목
  3. systemd에서, 가진 유닛 파일 Restart이 아닌 다른 값으로 옵션을 설정 no,
  4. Upstart에서 respawn지시문이 있는 서비스 구성 파일
  5. 와 같은 공정 모니터링 도구 monit또는
  6. 특정 서비스에 대한 특별 워치 독 프로세스.

프로세스가 시작되는 위치에 대한 더 많은 통찰력을 제공 할 수있는 흥미로운 새 (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에서 사용되는 시스템 호출입니다 (다른 모든 실행 호출은 실행을위한 프론트 엔드 일 뿐임).


2
sysdig는 훌륭한 조언입니다! BTW, 이제 제한된 기능으로 Windows (및 Mac에서는 가능)를 사용할 수 있습니다.
Neowizard

monit이 어떻게 도움이 되나요? 매뉴얼을 읽기 시작했지만 Nagios와 같은 대안이나 백업처럼 보입니다. 다시 생성 프로세스를 추적하는 데 어떻게 도움이되는지 모르겠습니다.
Jefferson Hudson

7

당신이 사용할 수 있다고 생각합니다 pstree. 명령을 다음과 같이 지정할 수 있습니다.

pstree -p PID

위의 내용은 Java 응용 프로그램의 모든 부모 목록을 제공합니다.


1
OP는 이미 PPID (1)를보고 있다고 말 했으므로 전혀 도움이되지 않습니다.
Guntram Blohm은 Monica

@GuntramBlohm, 편집하기 전에 원래 질문을 살펴보십시오. 질문의 첫 번째 버전에서는 언급되지 않았습니다.
Ramesh

2
한숨. 그의 편집 내용을 표시하지 않고 자신의 질문을 움직이는 대상으로 만드는 또 다른 포스터 :(
Guntram Blohm은 Monica

5

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 -efJava 기반 프로그램과 관련된 프로세스를 찾으십시오. Java 프로세스의 지속적인 생성을 담당하는 데몬 또는 "런처"를 발견해야합니다.


부모 프로세스를 찾으려고했지만 init (PPID = 1)를 가리 킵니다. 이 정보로 질문을 수정하겠습니다.
Jose

@JoseChavez, PPID가 1 인 경우 생성되는 Java 프로세스는 좀비 프로세스입니다. 이 답변을 여기서 확인하십시오 .
Ramesh

@JoseChavez 귀하의 사례를 조사하기 위해 몇 가지 트랙으로 답변을 편집했습니다.
John WH Smith

2
@Ramesh PPID가 1 인 경우 좀비 일 수도 있고 아닐 수도 있습니다 . 그들이 실제로 생성되지 않았다면 , 그들은 적어도 고아 입니다. 에 대한 지정은 그들이 좀비가있는 경우 표시됩니다 (예를 들어, ); 상태는입니다 . initstatepsps -eo pid,ppid,state,commZ
goldilocks

1
@goldilocks : PPID가 1이면 init 프로세스가 오작동하지 않는 한 좀비가 아닙니다 . 모든 고아 좀비를 즉시 거두는 대기 루프를 실행해야합니다.
hmakholm 님이 Monica

1

당신은 부모가 누구인지 알 수없는 경우, 당신은 당신에게 같은 일부 시스템 추적해야 인 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입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.