web-dev-qa-db-ja.com

スクリプトを自動起動するシェルスクリプト

ここで私の以前の投稿を参照したいと思います: クラッシュするたびに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

これらのエラーを解決するにはどうすればよいですか?

2
Craver2000

\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
RalfFriedl

ここには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文字が自動的に削除されます。

1
user88036