해결책

해결책

"enigma2"라는 프로세스가 존재하지 않을 때 변수를 0으로 채우는 스크립트를 만들려고 합니다.

이 스크립트를 실행하면...

#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"

출력이 나오네요...

0  
0  

이것이 바로 제가 기대했던 것입니다.

하지만 이 스크립트를 실행하면 다음과 같습니다.

#!/bin/sh

# Check if the no_enigma file exists
if [ -f /home/root/no_enigma ]; then
    # If enigma2 is running then kill it
    ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
    echo $ENIGMA_PID
    echo "$ENIGMA_PID"

    re='^[0-9]+([.][0-9]+)?$'
    if ! [[ $ENIGMA_PID =~ $re ]] ; then
       echo "error: Not a number" >&2; exit 1
    else
        echo "It IS a number"
    fi

        if [ "$ENIGMA_PID" -gt 0 ]; then
            echo $ENIGMA_PID
            echo "$ENIGMA_PID"
            echo "enigma2 is running"
            killall enigma2
        else
            echo "enigma2 is not running"       
        fi
    # Check if minisatip is running already, if not then start it
    MINI_PID=$(ps ax|grep minisatip|grep -v grep|wc -l | awk '{print $1}')
        if [ "$MINI_PID" -gt 0 ]; then
            echo "minisatip is already running"
        else
            echo "minisatip is not running"
            echo "starting minisatip"
            /usr/bin/minisatip --satip-xml http://127.0.0.1:8554 -R /usr/share/minisatip/html       
        fi
else
    # The no_enigma file does not exist
    # Check if minisatip is running, if yes then kill it
    MINI_PID=$(ps ax|grep minisatip|grep -v grep|wc -l | awk '{print $1}')
        if [ "$MINI_PID" -gt 0 ]; then
            echo "minisatip is running, killing it now"
            killall minisatip
        else
            echo "minisatip is not running"
        fi  
    # Check if enigma2 is running already, if not then start it
    ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
        if [ "$ENIGMA_PID" -gt 0 ]; then
            echo "enigma2 is already running"
        else
            echo "enigma2 is not running"
            echo "starting enigma2"
            /home/root/run_enigma.sh            
        fi
fi

나는이 출력을 얻습니다 ...

2  
2  
It IS a number  
2  
2  
enigma2 is running  
killall: enigma2: no process killed  
minisatip is already running 

#!/bin/sh두 번째 스크립트의 맨 위에서 제거 하면 예상되는 출력을 얻습니다.

0  
0  
It IS a number  
enigma2 is not running  
minisatip is already running  

다음 세 줄이 실행되는 이유는 무엇입니까?

#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"

$ENIGMA_PID변수의 값이 0인 것으로 올바르게 보고되지만
두 번째 스크립트에서는 동일한 세 줄이 변수 $ENIGMA_PID의 값이 2인 것으로 보고합니까?

고쳐 쓰다

아래 댓글에 있는 질문에 대한 답변은 다음과 같습니다.

이 스크린샷은 두 스크립트를 모두 실행하는 모습을 보여줍니다. minisatip 프로세스가 실행 중이고 enigma2 프로세스가 실행되지 않을 때마다.

여기에 이미지 설명을 입력하세요.

첫 번째 스크립트의 경로(3~4줄만)는 /home/root/test.sh입니다. 어디서든 실행할 수 있으며 다음과 같습니다. # test.sh
두 번째 스크립트의 경로는 /usr/bin /enigma2.sh입니다. 알겠어, 난 이렇게 운영해enigma2.sh

제안된 대로 두 스크립트를 모두 업데이트하여 파이프라인 명령에서 wc 및 awk를 제거했습니다. 이 명령의 출력은 변수에 값을 할당하기 위한 것입니다: ENIGMA_PID

/home/root/test.sh를 다음으로 변경했습니다.

#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"

/usr/bin/enigma2.sh에서 스크립트 상단에 다음 줄을 추가했습니다.

#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"

# Check if the no_enigma file exists
...
....

이제 스크립트를 실행하면 이 스크린샷에 출력이 표시됩니다.

여기에 이미지 설명을 입력하세요.

내가 확인하고 있는 프로세스는 경로가 /usr/bin/enigma2인 바이너리 파일입니다. 바이너리가 실행되고 있지 않습니다. 그러나 enigma2.sh 스크립트를 실행하면 두 개의 프로세스 ID가 있습니다. 스크립트 자체가 enigma2라고 불리기 때문인가요? 그렇다면 두 개의 프로세스 ID가 하나가 아닌 enigma2라고 불리는 이유는 무엇입니까?

질문
이 명령에서 무엇을 변경해야 합니까?
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')

.../usr/bin/enigma2.sh라는 스크립트 안에 있을 때...
그래서 스크립트를 계산하지 않고 실행 중인 프로세스의 일부인가요?
...바이너리 /usr/bin/enigma2가 실행되고 있지 않으면 결과는 0이어야 합니다.

감사합니다!

유연한

답변1

편집 내용을 보면 두 번째 스크립트가 이라는 것이 분명하며 명령줄에 작성하여 호출합니다 enigma2.sh. enigma2.sh스크립트는 경로 어딘가에 있습니다(당신은 스크립트가 PATH 변수에 있다고 /usr/bin/enigma2.sh가정합니다 ). /usr/bin쉘이 찾을 수 있는 스크립트(PATH에서)와 스크립트의 첫 번째 줄을 결합하여 #!/bin/sh커널은 명령줄을 사용하여 새 프로세스를 시작합니다.

/bin/sh enigma2.sh

다음과 같이 스크립트의 첫 번째 줄을 설정하면 이를 확인할 수 있습니다.

#!/bin/sh 
ps ax|grep enigma2
exit 0
...

스크립트를 삭제할 필요는 없습니다. 위에 표시된 줄을 스크립트 시작 부분에 넣고 나머지 모든 내용은 아래에 유지하기만 하면 됩니다.

다음을 얻으려면 실행하세요.

$ enigma2.sh
 3109 pts/6    S+     0:00 /bin/sh enigma2.sh
 3111 pts/6    S+     0:00 grep enigma2

단어를 포함하는 두 가지 프로세스가 있습니다 enigma2.

이것은 문제의 일부를 설명합니다. 이제 스크립트를 다음과 같이 변경하면:

#!/bin/sh 
enigma_pid=$(ps ax|grep enigma2)
echo "$enigma_pid"
exit 0
...                     # leave the old script below (no need to erase it).

그리고 실행하세요:

$ enigma2.sh
 3509 pts/6    S+     0:00 /bin/sh ./enigma2.sh
 3510 pts/6    S+     0:00 /bin/sh ./enigma2.sh
 3512 pts/6    S+     0:00 grep enigma2

이를 사용하면 $(…)추가 프로세스가 나타납니다 .

grep 프로세스를 제거하고 grep -v grep2개의 프로세스를 남겼습니다.

이것은 당신이 얻는 번호입니다 2.

노트: 대문자 변수 이름을 사용하지 마십시오. 이 이름은 환경 변수용으로 예약되어 있습니다. ENIGMA_PID를
사용하지 마세요

해결책

  • 첫째: 이름으로 프로세스를 식별하려면 다른 프로그램이나 스크립트에서 정확히 동일한 이름을 사용하지 마십시오. 이 스크립트를 호출할 수 있습니다 enigma33.sh.

  • 둘째: 이 경우 grep이 .로 끝나는 이름과 일치하도록 제한할 수 있습니다 2. 스크립트는 다음으로 끝나며 .sh계산되지 않습니다. 사용

     grep '[e]nigma2$'
    

그리고 필요한 것은 일치하는 행의 개수뿐이므로 ( -c)를 사용합니다.

enigma_pid=$(ps ax | grep -c '[e]nigma2$')

grep -v grep예, 정규 표현식은 [e]nigma2$(문자열로) 와 같을 수 없으므로 필요하지 않습니다 enigma2.

편집된 스크립트:

#!/bin/sh


# Detect If enigma2 is running.
enigma_pid=$(ps ax|grep -c '[e]nigma2$')
echo "$enigma_pid"    

# Deetct if minisatip is running.
mini_pid=$(ps ax|grep -c '[m]inisatip$' )


# Check if the no_enigma file exists
if [ -f /home/root/no_enigma ]; then
    if [ -z "${enigma_pid##*[!0-9]*}" ] ; then
       echo "error: Not a number" >&2; exit 1
    else
        echo "It IS a number"
    fi
    
    if [ "$enigma_pid" -gt 0 ]; then
        echo "$enigma_pid"
        echo "enigma2 is running"
        killall -r '[e]nigma2$'           # make killing more restrictive
    else
        echo "enigma2 is not running"
    fi
    # Check if minisatip is running already, if not then start it
    if [ "$mini_pid" -gt 0 ]; then
        echo "minisatip is already running"
    else
        echo "minisatip is not running"
        echo "starting minisatip"
        /usr/bin/minisatip --satip-xml http://127.0.0.1:8554 -R /usr/share/minisatip/html       
    fi
else    
    # The no_enigma file does not exist
    # Check if minisatip is running, if yes then kill it
    if [ "$mini_pid" -gt 0 ]; then
        echo "minisatip is running, killing it now"
        killall minisatip
    else
        echo "minisatip is not running"
    fi  
    # Check if enigma2 is running already, if not then start it
    if [ "$enigma_pid" -gt 0 ]; then
        echo "enigma2 is already running"
    else
        echo "enigma2 is not running"
        echo "starting enigma2"
        /home/root/run_enigma.sh            
    fi
fi

답변2

설명된 대로 ps ax명령은 두 번째 스크립트에서 실행될 때 다른 결과를 생성합니다.

명령이 다른 값을 생성하는 이유를 알아내기 위해 두 번째 스크립트를 디버깅하면 됩니다. 이 작업을 수행하십시오(디버깅 목적으로만).

ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"

그리고

ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"

출력에서 실제로 다른 점과 문제의 원인을 확인한 다음 그에 따라 스크립트를 조정하십시오. 귀하의 스크립트가 댓글에 제안된 대로라면이름포함은 enigma2거짓 긍정으로 감지됩니다.

관련 정보