Executa um script python sudo (ou de inicialização) do cron em um Raspberry Pi?

2

Estou ajudando com um projeto de arte ( link para os interessados) baseado no Raspberry Pi. O RPi controla uma faixa de LED endereçável através do GPIO, usando o dispositivo spidev por esses instruções . Para iniciar a exibição, nós executamos:

sudo python lightpaint-FF.py

Pretendemos levar este projeto para festas e festivais, então, idealmente, gostaríamos que ele fosse executado automaticamente na inicialização. (Nosso RPi não tem um monitor conectado, então agora temos que fazer login com outro laptop usando SSH e executar o código usando nohup antes de sair novamente).

Minha primeira tentativa de resolver esse problema foi escrever um script simples:

#!/bin/bash

if [ ! "$(pidof python)" ] 
 then
   sudo python /home/pi/lightpaint-FF.py
fi

E para modificar /etc/crontab para incluir

* * * * * root /home/pi/EggbeaterCronJob

O comportamento desejado é verificar a cada minuto se há alguma instância do Python em execução e, se não, iniciar o script python. Verifiquei que esse script funciona quando chamado de um terminal:

pidof python # returns nothing
sudo /home/pi/EggbeaterCronJob
pidof python # returns new process ID

Mas depois de atualizar meu crontab , nenhum ID do processo python aparece por conta própria. Só para ter certeza, também me certifiquei de que não estava cometendo um erro na minha configuração de crontab :

* * * * * root touch test-freaking-cron

Isso confirmou que cron estava de fato respondendo às minhas edições.

    
por Kevin 15.07.2013 / 20:21

2 respostas

2

Elimine o sudo não é necessário, pois ele é executado como root e o sudo, por padrão, não é executado sem tty.

Você pode dizer ao sudo para executar sem um tty executando visudo e comentando requiretty:

#Default requiretty

OBSERVE que isso tem desvantagens de segurança, consulte aqui

    
por 15.07.2013 / 21:41
0

Se você precisar iniciar um programa no momento da inicialização, a maneira mais fácil na maioria das configurações é adicionar um comando a /etc/rc.local . Se o arquivo existir, adicione esta linha a ele:

python /path/to/lightpaint-FF.py &

Se o arquivo não existir, tente criá-lo com o conteúdo

#!/bin/sh
python /path/to/lightpaint-FF.py &
exit 0

Algumas distribuições incorporadas não suportam /etc/rc.local . Se o que você está usando não, diga-nos o que é.

Se você precisar monitorar o programa e relançá-lo se ele morrer, você poderá fazê-lo através de init . Como fazer isso depende de qual init sua distribuição usa.

  • Para um init tradicional, adicione uma linha a /etc/inittab . O BusyBox pode suportar o inittab, mas é um recurso opcional que precisa ser selecionado em tempo de compilação.

    lp:2345:respawn:/usr/in/python /path/to/lightpaint-FF.py
    
  • Para iniciantes, escreva um trabalho inicial ( link ).

por 16.07.2013 / 01:53