리눅스 쉘 스크립트 관련 문의

CandleNo1   
   조회 25472   추천 0    

 Cent OS 7.9 

sh 파일 무한 반복 실행  

ck.sh 파일은 아래와 같습니다. 


#!/bin/sh


c_running() {

        ps ax|grep -v grep|grep -c "$*" > /dev/null 2>&1

}


do_ping() {

        if [ $? -eq 1 ]

        then

                        /bin/sh /serv/ping/do_ping.sh      > /serv/logs/ping-log

        fi

}


while true

do


        c_running "/bin/sh /serv/ping/do_ping.sh"

        do_ping do_ping

        sleep 5

done


-------------------------------------------


해당 파일을 

sh ck.sh &   

명령으로 무한 반복중 


불특정 시간이 지날때 해당 프로세스가 자동으로 죽음 


특별한 이슈 사항은 안 보이는데 종료 되여 서비스가 안되고 있습니다. 

혹시 참고할만한 사항이 있을 가요 ? 

딥마인드 03-20
세션유지와 연관있어 보이는데요
세션 유지조건을 확인해보셔야 할것같아요...
     
CandleNo1 03-20
파일은 참고로 root 로 권한은 777로 되여 있습니다.
그러고 보니 ssh 로 접속하여 sh ck.sh & 실행후 ssh 세션이 끊기면 프로세스가 종료되는거 같네요 ..   
주기적으로 제가 ssh 세션을 안 끊었을 때는 10시간 가까이도 쉘파일이 중지 안되였던거 같습니다.
백두성 03-20
원격 쉘 접속으로 스크립트 실행 중이라면 nohup 이나 screen 사용해보세요.
오늘 빙챗으로 쉘 스크립트 작성을 위해 도움을 받았는데,
질문을 잘 하면 원하는 답에 가깝게 결과를 얻을 수 있으니 Q/A 보다 훨씬 좋은 것 같습니다.
트니아빠 03-21
데미안만 이용하고 Cent OS는 안써봐도 모르겠지만..
서비스로 등록시키거나,
부팅 가능한 시스템이면 cron에 @reboot 를 이용해서 시작하면서 실행하거나,
매분마다 실행해도 되면 역시 cron에 등록시켜서 이용해 보겠습니다.
쉘 내에서 sleep 을 주고 무한 루프를 주는 구조같은데, 윗분 말씀대로 cron으로 외부에서 주기적으로 실행시켜주는 구조가 더 안정적일거 같습니다.
다만, cron은 최소 1분 주기이므로 혹여 1분내에 여러차례 수행이 완료될 수 있는 경우에는 실행시간과 프로세스 기 실행여부 등을 고려하여 한정적으로 루프를 돌아주는 방법도 있습니다.

아래는 예컨데 /serv/ping/do_ping.sh 가 10초정도 소요된다 가정할때 1분에 약 6회정도 프로세스를 체크해서 반복해서 돌려주는 쉘 스크립트 샘플 입니다.
해당 쉘을 cron에 등록해서 분마다 실행시켜 주면 됩니다.

#!/bin/bash
for i in {1..6}
do
    #  프로세스 상태 확인
    if ps -ef | grep /serv/ping/do_ping.sh | grep -v grep > /dev/null
    then
        #  실행 중인 경우 10초 대기 후 재실행
        sleep 10
    else
        # 실행 중이지 않은 경우 실행
        /serv/ping/do_ping.sh &
    fi
done
김장우 05-01
#!/bin/sh

c_running() {
    ps ax | grep -v grep | grep -q "$*"
}

do_ping() {
    if [ $? -eq 1 ]; then
        /bin/sh /serv/ping/do_ping.sh > /serv/logs/ping-log
    fi
}

while true; do
    c_running "/bin/sh /serv/ping/do_ping.sh"
    do_ping
    sleep 5
done

수정 사항:
1. ps ax|grep -v grep|grep -c "$*"을 ps ax | grep -v grep | grep -q "$*"로 변경했습니다. -q 옵션을 사용하면 grep이 찾은 결과의 개수를 출력하지 않고, 찾은 결과가 있으면 종료 상태 0을 반환합니다. 이렇게 하면 c_running() 함수에서 불필요한 출력을 하지 않습니다.
2. do_ping do_ping을 do_ping으로 변경했습니다. 이렇게 하면 do_ping 함수를 호출할 수 있습니다.

수정된 스크립트를 사용하면 문제가 해결될 것입니다. 이 스크립트를 실행하면, 5초마다 do_ping.sh 스크립트가 실행 중인지 확인하고, 실행 중이 아니면 해당 스크립트를 실행하여 결과를 로그 파일에 기록합니다.

---------------------------------
chatGPT가 이렇게 하라네요~?!
실행해보진 않았습니다. ^^


제목Page 5/98
03-31   23905   nelson1945
03-25   26386   plug5
03-22   25030   낄낄맨
03-20   25473   CandleNo1
03-20   25007   고양이는애옹
03-18   21564   고양이는애옹
03-18   12051   거룩
03-15   9849   엄청난x
03-15   8018   ksahn90
03-14   8832   중꺽마
03-10   11405   낄낄맨
03-08   12220   지유아빠
03-07   11554   지존컴퓨터
03-01   15579   라이크유
02-28   15489   라이크유
02-27   14847   박건
02-27   10582   remonemo
02-25   11829   Rainwalk
02-24   10412   라이크유
02-24   5756   다이다이