2012-09-07 3 views
6

상황 : 나는 상호 작용 쉘 제한되어있는 타사 데몬의 일련의 관리 [1] 시스템 리눅스를실행중인 프로세스가 예상되는 프로세스인지 어떻게 확인합니까?

[2] 초기화 스크립트, 즉 단지 {시작 | 재시작 | 중지 | 상태를} 사용할 수 있습니다.

문제 :

프로세스가 이전에 실행중인 프로세스의 PID를 가정 할 수는 프로세스의 상태는 PID를의와 실행중인 프로세스의 존재를 검사에 의해 확인된다.

예 : PID (123)의 런은,이어서 다이

있어서, PID (123)와 상태 명령을 프로세스 B의 처음 상태는 "OK"는 인증되지 않은 (에러)로 응답한다. 즉, 프로세스가 실행 중인지 확인하기 위해 PID로부터 프로세스의 존재 여부 만 확인합니다.이 PID가있는 프로세스가 있어야한다고 가정합니다. 문제의 프로세스입니다.

제안 된 솔루션 :

  1. 가 예상대로 PID 그대로 실행 명령/데몬을 보장하기 위해 PID를 사용하여 프로세스를 심문. 이 솔루션의 문제점은 명령과 PID가 모두 일치해야한다는 것입니다. 따라서, 다수 비트의 정보가 유지되고 동기화 될 필요가 있고, 에러/에지 조건에 부가적인 복잡성이 추가 될 필요가있다.
  2. 프로세스의 시작 시간과 PID 파일의 작성 시간을 연관 시키십시오. 프로세스가 PID 파일 작성 시간의 특정 델타 내에 있으면 실행중인 명령/데몬이 상당히 확실 할 수 있습니다.

PID로 실행되는 프로세스의 존재를 넘어서는 프로세스/PID 파일의 신뢰성을 표준화하는 표준 방법이 있습니까? 나는. 나는 (시스템으로) 당신 (프로세스)이 실행 중인지, 그리고 내가 당신이 누구인지 (A와 B가 아닌지)를 알고 싶습니다.

위에서 제안한 두 번째 솔루션을 구현한다고 가정하면 PID 생성 시간과 프로세스 시작 시간 간의 신뢰 구간/델타는 어느 정도입니까? 여기에서 합리적인 것은 유형 1/유형 2 오류간에 수용 가능한 절충을 의미합니다.

[1]에 CentOS/RHEL [2] 배시

+1

[ServerFault] (http://serverfault.com/)에 없습니까? – Graham

+0

타사 데몬을 직접 변경할 수 있습니까? 그렇다면,'flock'을 사용하여 데몬을위한 파일 시스템 잠금을 만들 수 있습니다. –

+2

프로세스 ID를 즉시 다시 사용 하시겠습니까? 나는 그것이 Windows의 경우 인 것을 안다. 그러나 나는 그것을 리눅스 나 유닉스에서 관찰하지 않았다. http://stackoverflow.com/questions/3446727/how-does-linux-determine-the-next-pid – cdarke

답변

5

파일의 내용 :

은/proc/{PID} /있는 CmdLine

명령 줄 사용 프로세스를 시작합니다. 그게 네가 필요한거야?

+0

이것은 제안 된 해결책 1에서 고려되었습니다 : 프로세스를 비준 할 때 pid 및 명령의 중복을 유지해야합니다. 정보의 두 비트를 유지하는 것이 그럴듯한 반면 추가 복잡성을 가중시킵니다. – Gary

+0

게리, "상당히 확실한"결과 또는 "확실한"결과를 원하십니까? 견적과 근사 결과가 충분하면 (그리고 그 사람 만 판단 할 수 있습니다.) 두 번째 솔루션을 구현하고 코드에 문제가 있으면 StackOverflow에 게시하십시오. 이것은 프로그래밍을위한 Q & A 사이트이며, 시스템 관리에 대한 최상의 실습이 아닙니다. 그 동안 init 스크립트를 사용하여 작업을 시작하는 대신 [Daemontools] (http://cr.yp.to/daemontools.html)로 전환하는 것이 좋습니다. – ghoti

+0

제안 해 주셔서 감사합니다, ghoti. 나는 제안 된 두 가지 해결책의 기능을 다룬다. 이 문제를 해결하기 위해 권장/표준 접근 방식이 있는지 확인하려고합니다. – Gary

0

내 해결책은 시작 시간과 함께 명령을 캡처하는 것입니다 (/proc/PID/cmdline 통해). absolute start time (ps -p PID -o lstart= 경유)을 사용하는 것이 효과가있는 것으로 보일 수 있지만 confusing results if your system clock changes (예 : NTP 업데이트 또는 일광 절약제)이 표시됩니다.그것은 종료에 나를 위해 자동으로 지워 것 있도록

# Prints enough detail to confirm a PID still refers to the same process. 
# In other words, even if a PID is recycled by a call to the same process the 
# output of this command should still be different. This is not guaranteed 
# across reboots. 
proc_detail() { 
    local pid=${1:?Must specify PID} 
    # the process' commandline, if it's running 
    # ensures a non-existant PID will never have the same output as a running 
    # process, and helps debugging 
    cat "/proc/$pid/cmdline" 2> /dev/null && echo 
    # this is the number of seconds after boot that the process started 
    # https://unix.stackexchange.com/a/274722/19157 
    # in theory this could collide if the same process were restarted in the same 
    # second and assigned the same PID, but PIDs are assigned in order so this 
    # seems acceptably unlikely for now. 
    echo "$(($(cut -d. -f1 < /proc/uptime) - \ 
      $(ps -p "$pid" -o etimes= 2> /dev/null || echo "0")))" 
} 

가 나는 또한 /dev/shm이 출력을 저장하기로 결정

여기 내 구현입니다. 실행 가능한 다른 옵션 (예 : @reboot cronjob)이 있지만 사용 사례가 tmpfs 인 경우 쉽고 깨끗합니다.

관련 문제