스크립트가 서비스 상태를 올바르게 보고하지 않습니다.

스크립트가 서비스 상태를 올바르게 보고하지 않습니다.

일반적인 서비스처럼 상태를 시작, 중지 및 확인하는 iperf용 스크립트가 있습니다. "service iperf start" 또는 "service iperf stop"을 실행하면 제대로 작동합니다. "service iperf status"를 실행하려고 하면 실행 중이 아닌 경우에도 항상 실행 중인 것으로 반환됩니다.

실행 시간:

#service iperf status
/usr/bin/iperf pid 37567 is running!!!

실행 중이 아닐 때:

# service iperf status
/usr/bin/iperf pid is running!!

내 전체 스크립트는 다음과 같습니다.

#!/bin/bash

# chkconfig: - 50 50
# description: iperf

DAEMON=/usr/bin/iperf
service=iperf
info=$(pidof /usr/bin/iperf)
is_running=`ps aux | grep -v grep | grep iperf | wc -l | awk '{print $1}'`

case "$1" in
      start)
              $DAEMON -s -D
              ;;
      stop)
              pidof $DAEMON | xargs kill -9
              ;;
      status)

             if [ $is_running != "1" ];
             then
                echo $DAEMON pid $info is running!!!
              else
                echo $DAEMON is NOT running!!!
              fi
              ;;
      restart)
              $DAEMON stop
              $DAEMON start
              ;;
      *)
              echo "Usage: $0 {start|stop|status|restart}"
              exit 1
              ;;
esac

스크립트의 상태 섹션에 있는 첫 번째 에코 문을 읽을 수 없는 것 같습니다. 올바른 출력을 얻고 있는지 확인하기 위해 명령줄의 스크립트 외부에서 ps 명령을 실행했습니다. 서비스가 실행 중이면 스크립트 검사에 따라 "1"이 반환됩니다. 실행 중이 아니면 "0"을 반환하므로 다음 echo 문을 계속 실행해야 하지만 그렇지 않습니다. 누구든지 이 문제를 해결하는 방법을 말해 줄 수 있나요?

RHEL 6.7 bash 버전 4.1.2를 사용하고 있습니다.

답변1

내 생각에는 당신이 노선을 바꾸고 싶어하는 것 같아요

if [ $is_running != "1" ];

~이 되다

if [ "$is_running" != "0" ];

이렇게 하면 실행 중인 인스턴스가 없을 때 iperfif가 실패하고 원하는 상태 메시지를 인쇄합니다. 현재 작성된 대로 iperf프로세스가 정확히 1개 있는 경우에만 실행되지 않는다고 보고합니다.

답변2

나는 그것에 대해 생각했다. ps를 사용하는 것과 관련이 있습니다. "service iperf status" 명령을 호출하면 ps는 항상 iperf가 있는 프로세스를 찾을 것이라고 생각합니다. 따라서 값은 항상 "1"이고 다른 값은 없습니다. 그래서 netstat를 사용하여 프로세스를 찾았습니다. 내 스크립트에서는 다음을 사용합니다.

IS_RUNNING=$(netstat -anp | grep ":5001" | grep "iperf" | awk '{print $7}' | cut -d"/" -f 2)

이 명령을 실행하면 명령이 "iperf"를 찾게 됩니다.

그러면 다음과 같이 if 문을 작성할 수 있습니다.

if [ "$IS_RUNNING" = iperf ];

이것은 내 문제를 해결했습니다.

관련 정보