"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 grep
2개의 프로세스를 남겼습니다.
이것은 당신이 얻는 번호입니다 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
거짓 긍정으로 감지됩니다.