Script shell para autostart script

2

Gostaria de me referir ao meu post anterior aqui: Autoiniciando um script python sempre que ele falhar para reiniciar dois scripts python no meu raspberry pi (Stretch OS) se eles falharem.

O código do script de shell chamado constantrun.sh é o seguinte:

#!/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

Eu executei os seguintes comandos no terminal:

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

Eu, então, dei permissão para meus scripts python, por exemplo chmod +x /home/pi/project/script1.py

Em seguida, para inicializar o script, usei:

sudo sh constantrun.sh 

No entanto, recebi as seguintes mensagens de erro:

/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

Como posso resolver esses erros?

    
por Craver2000 16.09.2018 / 15:40

2 respostas

2

Problemas com \r geralmente são causados pelo uso de um editor do Windows. Verifique seus scripts python. As atribuições para as variáveis de comando contêm espaço. Você usa sintaxe de matriz para se referir a eles, mas não os define como matrizes. Para PYTHONPATH ser útil, ele deve ser exportado.

Existe uma solução muito mais simples para isso:

#!/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 &)
    
por 16.09.2018 / 16:20
1

Acho que há duas questões importantes aqui:

Primeiro: Você tem que diferenciar entre a localização do seu executável python e a localização dos pacotes do site lib.

Seus pacotes de site python estão aqui:

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

Mas seus executáveis estão aqui:

/usr/bin

Quando você executou o comando which python , ele informou que os executáveis estão em /usr/bin

Sua variável de ambiente $ PATH deve conter caminhos que tenham arquivos executáveis, por exemplo

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

Se o seu executável estiver em outro local que não seja o seu caminho e você não quiser necessariamente adicionar esse local ao seu caminho, poderá criar apenas um link simbólico. Por exemplo:

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

Segundo: Você criou seus pythons no Windows, depois moveu os scripts para o ambiente Linux, provavelmente seus scripts contêm CR caracteres ou dos breaks . Você pode limpar os scripts dos caracteres CR da seguinte forma:

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

Ou simplesmente, abra os scripts "script1.py" e "script2.py" em emacs e salve-os novamente. Isso removerá os caracteres CR automaticamente.

    
por 16.09.2018 / 16:21