2013-11-23 5 views
3

내 컴퓨터를 시작할 때 실행하려고하는 Java jar 프로그램이 있습니다. 이상적으로, 쉘 스크립트는 60 초마다 점검하여 항아리가 실행 중인지 확인합니다. jar 파일이 centos에서 실행되고 있는지 어떻게 확인할 수 있습니까?쉘에서 실행중인 jar 파일 확인

나의 현재의 .sh 파일 :

#!/bin/bash 

while [ true ] 
do 
    cnt=`ps -eaflc --sort stime | grep /home/Portal.jar |grep -v grep | wc -l` 
    if(test $cnt -eq 3); 
    then 
     echo "Service already running..." 
    else 
     echo "Starting Service" 
     java -jar /home/Portal.jar >> /dev/null & 
    fi 
    sleep 1m 
done 

는 지금까지 참조하는 this을 사용했다.

+1

작동하지 않는 것은 무엇을 의미합니까? 문제가 정확히 무엇입니까? –

+0

항상 서비스를 시작합니다. 그것은 이미 프로그램이 실행되고 있는지 감지 할 수 없습니다 – Sixthpoint

답변

3

프로그램에 따라 프로그램을 검사하는 방법이 다소 다를 수 있습니다. 예를 들어 서버가있는 경우 포트에서 수신 대기합니다.

그런 다음

netstat -an | fgrep tcp | fgrep LISTEN | fgrep :87654 # or whatever your port is 

같은 일을 할 수 있습니다.

그러면 청취 포트를 감지 할 수있는 lsof이 있습니다.

마지막으로 의사 요청을 연결하여 실행할 수 있습니다. 예를 들어 http 서버의 경우 lynx 또는 curl을 사용할 수 있습니다. stamdard가 아닌 프로토콜을 사용하는 서버의 경우 서버에 연결하여 서버가 있는지 여부를 확인하는 것이 유일한 목적 인 작은 클라이언트 프로그램을 작성할 수 있습니다.

-1

$cnt3과 같아야합니까? 프로세스가 이미 실행 중이면 1과 같지 않아야합니까?

+0

pgrep 자바를 할 때 실행중인 프로세스가 3 개 발생했습니다 – Sixthpoint

+0

문제는 다음과 같습니다 : test : -eq : 단항 연산자가 예상 됨 – Sixthpoint

+0

'pgrep java'는 귀하의 명령 실제로 않습니다! 특정 애플리케이션을 찾고 있습니다! 나는'if [$ cnt -eq 1]'로 그것을 할 것이다.스크립트를 실행하고기도하는 것뿐만 아니라 올바르게 작동 할 때까지 스크립트의 비트를 시험해야합니다. –

1

나는 몇 달 전에 매우 동일한 시나리오를 수행했습니다. 내 임무는 리눅스 서버에서 24/7을 실행하는 jar 분산 자바 프로그램을 보장하는 것이었다. 내 프로그램이 콘솔 기반이었고, 시작된 다음 무언가가 중지되었습니다. 시작한 셸 스크립트를 끝내기 위해 기다렸다가 무한 루프에서 앱을 다시 시작했습니다. runit을 설치하고 서비스를 생성하고이 스크립트를 실행 스크립트로 제공했습니다. 아주 잘 작동합니다. 일반적으로 쉘 스크립트는 java 프로그램이 실행되고 runit이 시작 스크립트 (스크립트)가 실행 중인지 확인합니다.

당신은 가치가 여기에 정보를 찾을 수 있습니다 : 파일 http://smarden.org/runit/faq.html

3

저장 프로세스 ID를이 과정을 확인합니다.

#!/bin/bash 

while [ true ] 
do 
    pid=$(cat /tmp/portal.pid) 
    if [[ -n "$pid" && $(ps -p $pid | wc -l) -eq 2 ]] 
    then 
     echo "Service already running..." 
    else 
     echo "Starting Service" 
     java -jar /home/Portal.jar >> /dev/null & 
     echo $! > /tmp/portal.pid 
    fi 
    sleep 1m 
done 

/tmp

는 재시작이 경우 모든 권리를 지워집니다.

0

프로세스를 잠자기 상태로 설정하는 대신 종료하고 crontab을 사용하여 매 1 분마다 프로세스를 실행하고 실행 중인지 또는 다른 프로세스가 스크립트를 중지하는지 확인합니다.

#!/bin/sh 
declare -a devId=("/Path/To/TestJar.jar Test1" "/Path/To/TestJar.jar Test2") #jarfile with pathname and Test as argument 
# get length of an array 
arraylength=${#devId[@]} 
# use for loop to read all values and indexes 
for ((i=1; i<${arraylength}+1; i++)); 
do 
y=${devId[$i-1]} 
cnt=`ps -eaflc --sort stime | grep "$y" |grep -v grep | wc -l` 
if [ $cnt = 0 ] 
then 
java -jar $y& > /dev/null 
b=$(basename $y) 
echo $b 
#DO SOME OPERATION LIKE SEND AN EMAIL OR ADD TO LOG FILE 
continue 
elif [ $cnt != 0 ] 
then 
echo 'do nothing' 
fi 
done 
관련 문제