Executando um script Python na inicialização

29

Essa pergunta já foi feita algumas vezes antes, mas não consegui fazê-la funcionar usando as informações existentes.

Meu Pi roda Raspbian. Eu tenho um script Python chamado dnscheck.py que faz um loop para sempre.

Eu preciso que ele seja executado na inicialização. Eu sei que tenho que criar um arquivo .sh contendo algo como

sudo python dnscheck.py &

O que eu não sei é onde esse arquivo deve estar ou se deve conter mais alguma coisa. Eu sei sobre a pasta init.d, mas vendo o exemplo do esqueleto, imagino que deveria haver uma maneira mais simples de fazer essa tarefa simples.

Vlad Schnakovszki
fonte
para uma verdadeira forma de pagamento fácil este tutorial passo a passo -> youtu.be/Tvnrx-2QaUU fazer tanto lançadores de como você precisa e endereço de todos eles em crontab
Hossein RM

Respostas:

20

Se você deseja controlar o processo com comandos como iniciar, parar, reiniciar, etc, usando o script do esqueleto e alterá-lo para seus propósitos pode ser a melhor opção.

Se você quer apenas o processo para começar, coloque o comando no /etc/rc.local. (Eu não tenho meu RPi em mãos, mas li on-line que há uma linha de 'saída 0', você deve colocar seu comando acima dessa linha)

ikku
fonte
1
Funcionou! Devo acrescentar que definir as permissões para o script e rc.local de volta para 755 (leitura / gravação / execução) é uma obrigação. Não tenho certeza se ambos precisam dessa configuração, mas funcionou para mim. Muito obrigado pela ajuda!
Vlad Schnakovszki
7
"como você escreveu na sua pergunta" Não é bem assim - você não precisa do sudo como o rc.localroot. Você também deve especificar o caminho completo para o script, obviamente. Você também deve adicionar& no final para que o script bifurque, por exemplo /path/to/foobar.py &.
goldilocks
1
@goldilocks, você poderia explicar por que preciso adicionar &? Porque quando eu uso sem ele, tudo continua funcionando como esperado.
Huy.PhamNhu
2
@ Huy.PhamNhu Respondendo à sua pergunta: O Pi executará este programa na inicialização e antes que outros serviços sejam iniciados. Se você não incluir oe comercial e se o seu programa for executado continuamente, o Pi não concluirá seu processo de inicialização. Oe comercial permite que o comando seja executado em um processo separado e continue inicializando com o processo principal em execução.
Amine Harbaoui
6

Mova seu script (vamos salvá-lo no arquivo dnscheck) para /etc/init.d/e defina as permissões para que ele possa ser executado:

chmod 755 /etc/init.d/dnscheck

Adicione as tags de inicialização LSB na parte superior do seu script. Você provavelmente desejará alterar Início / Parar Necessário e as Tags de Descrição para se ajustarem ao seu script.

### BEGIN INIT INFO
# Provides:          dnscheck
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Em seguida, crie os links simbólicos executando

update-rc.d /etc/init.d/dnscheck defaults
Bert
fonte
2
Embora essa tenha sido uma resposta decente há 3 anos e meio e ainda funcione porque o novo sistema init do Raspbian é compatível com os scripts do estilo LSB / SysV, é melhor que os novos usuários aprendam a usar o novo sistema ( systemd ) se apenas adicionar uma linha a /etc/rc.localfor insuficiente.
goldilocks
3

Existem muitas maneiras de fazer isso, é claro, mas não se esqueça de usar cron. Se você colocar uma @rebootlinha no seu crontab, esse comando será executado a cada reinicialização.

Para testar, adicionei a seguinte linha ao meu usuário crontab com crontab -e: @reboot echo "$(date)" >> ~/boot.txt O bônus desse método é que você pode chamar o trabalho conforme necessário em outros intervalos, além do tempo de inicialização, e não precisa editar scripts de inicialização.

bobstro
fonte
3

se você usar o arquivo rc.local, isso pode ser útil para solucionar problemas. Você pode adicionar linhas de log para registrar erros (stderr) e comandar a saída (stdout) no arquivo de log. De acordo com este exemplo, esse arquivo é salvo em /tmp/rc.local.log

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exec 2> /tmp/rc.local.log      # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file

# Your other commands...

exit 0

Ler mais

Tharanga
fonte
3

Estou realmente surpreso que os daemontools do djb não sejam mencionados aqui. O Daemontools supervisiona adequadamente o processo e você pode adicionar recursos interessantes, como o log girado automaticamente. TL; DR, se você não estiver familiarizado com nada disso, seu processo será reiniciado toda vez que falhar e será iniciado automaticamente quando o Pi for ativado. Isso é ótimo se você escreveu um programa python ruim com modos de falha, mas não quer que ele morra se um erro for encontrado.

Instalar:

sudo apt-get install daemontools daemontools-run

Em seguida, siga as etapas para criar processos daemonized:

É tão simples quanto copiar um runscript para /etc/service/<my_custom_service_name>Outra vantagem: você pode executar como qualquer usuário ou root! Detalhes no link.

FWIW Eu tinha um projeto Pi em que tinha 3 processos python diferentes (cada um tinha um loop de execução usando o tempo da CPU, portanto, usando 3 processos, permiti que cada processo aproveitasse 1 núcleo da CPU). O Daemontools me permitiu garantir que todos os três fossem executados automaticamente e continuariam sendo executados após eu conectar o Pi.

Sam
fonte
solução simples e fácil, sua resposta economizou muito tempo, obrigado ..
ShivaGuntuku
2

Aqui está a solução que eu uso constantemente.

Crie um arquivo da área de trabalho

xyz.desktop

digite o seguinte nele

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=<Application Name Goes here>
Comment=
Exec=  python /home/pi/Desktop/execute_on_boot.py
StartupNotify=false
Terminal=true
Hidden=false

cole esse arquivo no

/home/pi/.config/autostart/

e reinicie o seu raspberry pi e ele deve executar automaticamente o seu programa em um novo terminal

evolucionista
fonte
não recorte e cole respostas para várias perguntas. Se a resposta for a mesma, a versão mais recente deverá ser sinalizada como duplicada.
27615 Steve Robillard
A única razão pela qual não o fiz foi porque esta página tinha um número maior de visualizações em oposição à outra.
Evolucionista
@SteveRobillard Eu também não acho que eu tenho o representante obrigados a fazê-lo
evolutionizer
A sinalização de uma postagem leva apenas 15 repetições. Decidir o que fazer a respeito é o trabalho dos moderadores - portanto, o número de visualizações é irrelevante. Respostas duplicadas são sinalizadas automaticamente pelo sistema. Eles são uma forma de jogar no sistema. Portanto, eu apaguei o terceiro.
22615 Steve Robillard
@SteveRobillard Obrigado pela informação e perdoe minha ignorância. Eu lá sinalizei a pergunta anterior como duplicada.
Evolucionista
2

Para usar um arquivo .py, basta colocar a linha #!/usr/bin/pythonno início do seu arquivo. Em seguida, torne-o executável com chmod +x filename. Em seguida, adicione a linha /path/to/file.py &de /etc/rc.localantes da exit 0linha (troca /path/to/file.pycom o caminho para o script). Isso fará com que seu script python seja executado no final da inicialização.

Teoremador
fonte
0

Aqui está um método ainda mais fácil que funcionou para mim. Modifique a inicialização automática no LXDE.

Abra um terminal e edite o arquivo de inicialização automática da seguinte maneira:

sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

adicione a seguinte linha de texto na parte inferior (modifique o caminho conforme necessário para onde o seu example.py está localizado)

@/usr/bin/python /home/pi/example.py

ctr-x e salve. Pode ser necessário tornar o script python executável da seguinte maneira:

sudo chmod +x /home/pi/example.py

referência para inicialização automática no LXDE e referência para tornar o python executável

hidrônica
fonte
Note que isso não vai funcionar se você não começar em um gui (ie: executar o seu pi sem cabeça)
Havnar
0

essas soluções não funcionaram para mim, tentando iniciar um script python com o Feh. O seguinte funcionou. Inicia um script após o login.

Abra uma sessão do terminal e edite o arquivo

sudo nano /etc/profile

Adicione a seguinte linha ao final do arquivo

/home/pi/your_script_name.sh

substitua o nome e o caminho do script pelo nome e caminho corretos do script de inicialização. Salvar e sair

Pressione Ctrl + X para sair do nano editor seguido de Y para salvar o arquivo.

Aqui está a aparência do meu script.sh:

#!/bin/sh
cd /
cd home/pi/
sudo python your_python_sript.py &
exit 0
cd /

Acho que criei o script.sh e o script.py executáveis ​​usando o chmod

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
hidrônica
fonte