2016-11-01 3 views
0

Java 프로그램을 시작한 System V init 스크립트가 있습니다. 어떤 이유로 PID 파일이 생성 될 때마다 하나가 아닌 여러 개의 PID가 포함됩니다.PID 파일에 여러 개의 PID가 저장되는 경우

daemon --pidfile=$pidfile "$JAVA_CMD &" >> $logfile 2>&1 
RETVAL=$? 
usleep 500000 

if [ $RETVAL -eq 0 ]; then 
    touch "$lock" 

    PID=$(ps aux | grep -vE 'grep|runuser|bash' | grep <myservice> | awk '{print $2}') 

    echo $PID > $pidfile 

내가 수동으로 ps aux... 명령을 테스트 할 때, 한 줄의 반환 :

다음은 서비스를 시작하고 PID 파일에 기록하는 관련 코드입니다. 스크립트로 실행하면이 호출이 여러 PID를 반환하는 것처럼 보입니다.

PID 파일의 내용 예 : 16601 16602 16609 16619 16690. 16619은 위에서 언급 한 ps aux... 명령을 수동으로 실행할 때 발견되는 실제 프로세스 ID입니다.

+1

난 당신이 마지막 awk 명령을 제거하고 무슨 일이 일어나고 있는지 확인하는 것이 좋을 것 ... –

+1

당신은'pid'를 받고에만 관심이 있습니다. 'ps '대신'pgrep'을 사용하십시오. 'pid'를 반환합니다. 'PID = $ (pgrep -f )'을 시도해보십시오. 또는 지름길을 이용하십시오. '$ PID'에 할당하지 마십시오. 'pgrep -f > $ pidfile'을 시도해보십시오. – alvits

답변

1

greps을 뒤집어보십시오. 첫 번째는 (-vE) myservice이 시작되기 전에 실행될 수 있습니다. 서비스에 대한 그렙은 FIRST, 다음 원치 않는 행을 필터링 :

PID=$(ps aux | grep <myservice> | grep -vE 'grep|runuser|bash' | awk '{print $2}') 
관련 문제