Shell脚本到自动启动脚本

Shell脚本到自动启动脚本

我想在这里参考我之前的帖子:每当 python 脚本崩溃时自动启动raspberry pi在我的(Stretch OS)上重新启动两个 python 脚本(如果它们崩溃)。

调用的shell脚本代码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 字符。

相关内容