ここで私の以前の投稿を参照したいと思います: クラッシュするたびにpythonスクリプトを自動起動する 2つのpythonスクリプトを再起動するRaspberry Pi
(ストレッチOS)クラッシュした場合。
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
これらのエラーを解決するにはどうすればよいですか?
\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つの重要な問題があると思います。
First: python実行可能ファイルの場所とlibsite-packagesの場所を区別する必要があります。
あなたの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
Second: Windowsでpythonを作成してから、スクリプトをLinux環境に移動しました。おそらく、スクリプトにはCR
文字またはdos breaks
が含まれています。次のように、CR文字からスクリプトを削除できます。
vi +':wq ++ff=unix' script1.py
vi +':wq ++ff=unix' script2.py
または、emacs
でスクリプト「script1.py」と「script2.py」を開いて、もう一度保存します。これにより、CR文字が自動的に削除されます。