여기에서 이전 게시물을 참조하고 싶습니다.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 문자가 자동으로 제거됩니다.