자동 시작 스크립트를 위한 쉘 스크립트

자동 시작 스크립트를 위한 쉘 스크립트

여기에서 이전 게시물을 참조하고 싶습니다.Python 스크립트가 충돌할 때마다 자동으로 시작됩니다.raspberry pi충돌이 발생하면 광산(Stretch OS)에서 두 개의 Python 스크립트를 다시 시작합니다.

호출되는 쉘 스크립트 코드는 constantrun.sh다음과 같습니다.

#!/bin/sh

PYTHONPATH=/home/pi/.local/lib/python2.7/site-packages
COMMAND1=python /home/pi/project/script1.py
COMMAND2=python /home/pi/project/script2.py

rm -f COMMAND1_failed; ("${COMMAND1[@]}"; touch COMMAND1_failed)&
rm -f COMMAND2_failed; ("${COMMAND2[@]}"; touch COMMAND2_failed)&

while true
do
        if [ -e COMMAND1_failed ]
        then
                # Restart Command1
                rm -f COMMAND1_failed; ("${COMMAND1[@]}"; touch COMMAND1_failed)&
        fi
        if [ -e COMMAND2_failed ]
        then
                # Restart Command2
                rm -f COMMAND2_failed; ("${COMMAND2[@]}"; touch COMMAND2_failed)&
        fi

        sleep 60
done

터미널에서 다음 명령을 실행했습니다.

sudo chmod +x constantrun.sh # to make the script executable

그런 다음 다음과 같은 Python 스크립트에 권한을 부여합니다.chmod +x /home/pi/project/script1.py

다음으로 스크립트를 초기화하기 위해 다음을 사용했습니다.

sudo sh constantrun.sh 

그러나 다음과 같은 오류 메시지가 나타납니다.

/usr/bin/env: ‘python\r’: No such file or directory
/usr/bin/env: ‘python\r’: No such file or directory
constantrun.sh: 7: constantrun.sh: Bad substitution
constantrun.sh: 8: constantrun.sh: Bad substitution

이러한 오류를 어떻게 해결할 수 있나요?

답변1

문제는 \r일반적으로 Windows 편집기를 사용하여 발생합니다. Python 스크립트를 확인하십시오. 명령 변수에 대한 할당에는 공백이 포함되어 있습니다. 배열 구문을 사용하여 참조할 수 있지만 배열로 정의하지는 마세요. 유용하게 사용 하려면 PYTHONPATH내보내야 합니다.

이 문제에 대한 더 간단한 해결책이 있습니다.

#!/bin/sh

export PYTHONPATH=/home/pi/.local/lib/python2.7/site-packages
COMMAND1="python /home/pi/project/script1.py"
COMMAND2="python /home/pi/project/script2.py"

(while true; do $COMMAND1; done &)
(while true; do $COMMAND2; done &)

답변2

나는 여기에 두 가지 중요한 문제가 있다고 생각합니다.

첫 번째:Python 실행 파일의 위치와 lib 사이트 패키지의 위치를 ​​구별해야 합니다.

귀하의 Python 사이트 패키지는 다음과 같습니다.

/home/pi/.local/lib/python2.7/site-packages

하지만 실행 파일은 여기에 있습니다:

/usr/bin

명령을 실행하면 which python실행 파일이 있음을 알려줍니다./usr/bin

$PATH 환경 변수에는 실행 파일이 있는 경로가 포함되어야 합니다.

$ echo $PATH /usr/bin:/usr/local/bin:/home/User/bin

실행 파일이 경로가 아닌 다른 곳에 있고 해당 위치를 경로에 추가하고 싶지 않은 경우 심볼릭 링크를 만들면 됩니다. 예를 들어:

ln -s /path/to/executable /usr/bin/executable

두번째:Windows에서 Python을 만든 다음 스크립트를 Linux 환경으로 옮겼습니다. 스크립트에 CR문자가 포함되어 있거나 dos breaks다음과 같이 스크립트에서 CR 문자를 지울 수 있습니다.

vi +':wq ++ff=unix' script1.py
vi +':wq ++ff=unix' script2.py

또는 "script1.py" 및 "script2.py" 스크립트를 열고 emacs다시 저장하면 됩니다. 그러면 CR 문자가 자동으로 제거됩니다.

관련 정보