Executar script na inicialização

188

Estou tentando executar um script quando meu Raspberry Pi é inicializado. Eu gostaria que o navegador fosse aberto automaticamente.

Tentei encontrar uma solução simples (como soltar meu script em algum diretório "startup" ou algo semelhante), mas não estou vendo nada parecido.

Eu olhei para o Upstart , mas estou lutando para entender como isso funciona. Todos os scripts que eu tentei não funcionaram quando os testei.

Tyler Murry
fonte
4
Que sistema operativo esta a utilizar? No FreeBSD, que estou usando no meu Pi, você pode adicionar scripts de inicialização ao /usr/local/etc/rc.d/ ou apenas adicionar coisas ao /etc/rc.local. Diferentes distribuições Linux têm diferentes métodos recomendados. Se você estiver executando o X nele, poderá adicionar coisas ao seu arquivo .xinitrcou .xsession.
ghoti
Mais informações sobre o processo de inicialização do X podem ser encontradas aqui .
ghoti
6
Observe que a resposta aceita aqui tem algumas advertências e tecnicamente não inicia nada na inicialização, exceto sob condições específicas. Leia atentamente.
goldilocks
Você está solicitando um script que seja executado quando você efetua login, não quando o pi é inicializado ou na inicialização. Duas coisas muito diferentes, e o título está distorcendo os resultados de pesquisa do Google.
IAmNaN

Respostas:

196

Para executar o Midori na inicialização, dê uma olhada neste tutorial . Para soluções de bricolage, continue a ler.


Você pode adicionar o seu comando executável de script na parte inferior .bashrc, para executar seu script sempre que abrir um terminal (ou executar uma nova instância de bash) .

  1. Verifique se você está na pipasta:

    $ cd ~
    
  2. Crie um arquivo e escreva um script para executar no arquivo:

    $ sudo nano superscript
    
  3. Salvar e sair: Ctrl+ X, Y,Enter

  4. Abra .bashrcpara configuração:

.bashrcé não pretende executar scripts.

É executado sempre que um shell interativo sem login é iniciado e é usado para configurar o shell.
~/.bashrc: executed by bash(1) for non-login shells.

   $ sudo nano .bashrc
  1. Role para baixo até a parte inferior e adicione a linha: ./superscript

  2. Salvar e sair: Ctrl+ X, Y,Enter


Se você está procurando uma solução que funcione na inicialização do console , dê uma olhada neste link . Resumo básico:

  1. Crie um arquivo para o seu script de inicialização e escreva-o no arquivo:

    $ sudo nano /etc/init.d/superscript
    
  2. Salvar e sair: Ctrl+ X, Y,Enter

  3. Torne o script executável:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Registre o script a ser executado na inicialização:

    $ sudo update-rc.d superscript defaults
    

Se você deseja que um script seja executado quando você inicializa no ambiente LXDE , consulte esta postagem no fórum do Raspberry Pi :

  1. Navegar para ~/.config/lxsession/LXDE-pi

  2. Abra o autostartarquivo nessa pasta:

    $ sudo nano autostart
    
  3. Adicione @midoriuma nova linha. Se você deseja executar algo como um script python, coloque algo como @python mypython.pyem uma nova linha. A execução de um arquivo de script seria @./superscript, mas, por algum motivo, o script é executado em um loop infinito (talvez isso pare com isso).

  4. Salvar e sair: Ctrl+ X, Y,Enter

  5. Reinicie seu Raspberry Pi no ambiente LXDE.

syb0rg
fonte
O tutorial sobre como configurar o Midori na inicialização foi exatamente o que eu estava procurando. Não sei por que existem tantas maneiras de fazer uma coisa tão simples, mas estou feliz que esteja funcionando agora.
quer
11
@ syb0rg A execução na parte de login funciona como um encanto (+1) se eu efetuar login via ssh, mas não quando a sessão da área de trabalho lxde for iniciada. existe uma maneira de fazer isso?
George Profenza 13/09
@GeorgeProfenza Quando você faz $ sudo startx?
syb0rg 13/09/2013
2
Só queria ressaltar que o script pyhton será executado, mas se houver algum erro, ele estará em algum lugar no segundo plano usando o método / etc / xdg / lxsession / LXDE / autostart. usando .barshrc irá revelar erros também, mas é muito importante para garantir que o script é apertado em primeiro lugar (descobriu isso da maneira mais difícil :))
George Profenza
7
.bashrcnão é lido quando o sistema inicializa ou quando um usuário efetua login , apenas ao abrir um novo terminal (e é lido sempre que o usuário abre um novo terminal). Estou perplexo que esta resposta tenha recebido muitos votos: a primeira parte está completamente errada . A terceira parte está correta para executar um programa GUI.
Gilles
46

A maneira como eu vi a maioria das pessoas fazer isso (dê uma olhada nos fóruns do Raspberry Pi) e me fiz sucesso é usando /etc/rc.local.

Tudo o que você precisa fazer aqui é colocar ./myscriptno arquivo de texto rc.local. Se estiver em python, coloque python myscript.py.

Isso literalmente é "uma solução simples (como soltar meu script em algum diretório" de inicialização "ou algo semelhante)" - talvez pesquise nos fóruns quando você estiver com dúvidas, essa solução surgiu nos 4 primeiros resultados de um pesquisa do Google!

avidreader610
fonte
4
Para sua informação, o rc.local por padrão possui vários comentários sobre o script, sem fazer nada e precisando de bits executáveis ​​alterados. Isso não é verdade, basta digitar o comando do seu script antes da saída 0 e ele será executado na inicialização. Verifique se o seu script sai das execuções em segundo plano ou bloqueia o prompt de login. Sim, foi o que eu fiz.
22614 Rob
@rob Você quer dizer que eles sugerem que o script seja definido como executável? Esta é mitigado na questão executando o script pelo comando python myscript.py. Se você deseja chmod + x e adicionar #! /bin/python, você pode executar o script fazendo o $pathtofile/myscript.pyque $pathtofileé, .se estiver no mesmo diretório ou no caminho absoluto ou relativo do arquivo.
JFA
11
Isso não é bom para um programa de interface gráfica do usuário, como um navegador. /etc/rc.localé apenas para iniciar serviços do sistema (programas que não possuem uma interface de usuário).
Gilles
11
@ ErickM.Sprengel Use uma das respostas corretas neste tópico, como este .
Gilles
32

Adicione-o ao crontab

O crontab executa comandos em horários definidos.


Edite o arquivo:

sudo crontab -e

Adicione linha ao arquivo (aqui, um script python):

@reboot python3 /home/pi/Desktop/exemple.py &
Aaron
fonte
2
Para ser um pouco mais exigente aqui, tecnicamente não é o crontab que executa o comando, mas de qualquer maneira. No que diz respeito à linha listados para adicionar, é aconselhável colocar caminhos completos para os comandos definidos aqui (neste caso o caminho completo para python3), veja aqui
Ghanima
Este é o método que eu sempre usei devido à sua simplicidade. +1
Patrick Cook
Isso não é bom para um programa de interface gráfica do usuário, como um navegador. /etc/rc.localé apenas para iniciar programas que não possuem uma interface de usuário.
Gilles
2
Depois de passar muito tempo tentando fazê-lo funcionar com o rc.local e o init.d e todo tipo de outras coisas ... isso funcionou imediatamente! Graças allot!
Piotr Kula
4
isso não funciona por algum motivo no OS RPI
Denis
11

Inicialização automática de aplicativos xorg

Se o script que você deseja iniciar exigir uma sessão do xorg, tente seguir a especificação de inicialização automática do freedesktop, que pode ou não funcionar, dependendo do ambiente de área de trabalho que você está usando.

Como alternativa, você pode direcionar seu ambiente de área de trabalho específico, conforme descrito em https://wiki.archlinux.org/index.php/autostarting .

Executando um script como um serviço systemd

Se o seu script se encaixa na descrição de um daemon ou 'serviço', e seu sistema está executando o systemd, que é o caso das versões raspbian e mais modernas, você pode configurar o script para executar como um serviço systemd - isso fornece controle granular sobre o ciclo de vida e o ambiente de execução, bem como as pré-condições para (re) iniciar o script, como a rede em funcionamento. Também é possível configurar a reinicialização do serviço em caso de falha ( Restart=alwayse atraso entre a reinicialização, por exemplo RestartSec=10).

Para uso em todo o sistema, crie seu arquivo de unidade systemd em /etc/systemd/system, por exemplo, com vim /etc/systemd/system/autossh.service:

[Unit]
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=/usr/bin/killall -9 autossh
### NOTE: you can have multiple `ExecStop` lines
ExecStop=/usr/bin/killall ssh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Veja também:

Agora estamos prontos para testar o serviço:

systemctl start autossh

Verificando o status do serviço:

systemctl status autossh

Parando o serviço:

systemctl stop autossh

Depois de verificar se o serviço funciona conforme o esperado, ative-o com:

systemctl enable autossh

NOTA: Por motivos de segurança, systemdo script será executado em um ambiente restrito, semelhante à maneira como os crontabscripts são executados, portanto, não faça suposições sobre variáveis ​​de sistema preexistentes. Use as Environmentchaves se seu script precisar de variáveis ​​específicas a serem definidas. Adicionar set -xna parte superior do script bash e depois executar systemctl status my_servicepode ajudar a identificar por que o script está falhando. Como regra geral, sempre use caminhos absolutos para tudo, incluindo echoe cat, ou defina explicitamente seu $ PATH.

ccpizza
fonte
7

Eu quero jogar meus dois centavos, mesmo que essa seja uma pergunta antiga, mas geralmente solicitada a fazer uma coisa simples - a inicialização automática. Eu tentei todas as soluções sugeridas em todas as respostas para esta pergunta. Nenhum deles trabalhou para mim. Estou usando o Raspberry PI Model 2 com Raspbian.

A única maneira de conseguir que meu aplicativo seja iniciado automaticamente com êxito é através de um script da seguinte maneira. Digo com sucesso porque meu aplicativo foi iniciado conforme o esperado, sem ter nenhum problema, como começar com o caminho de trabalho errado.

1.Crie um arquivo vazio com a extensão .sh e nomeie-o como desejar.

2.Copie e cole EXATAMENTE o seguinte, exceto altere "o nome do seu aplicativo" para o nome do script que você acabou de criar.

 #! /bin/sh

 ### BEGIN INIT INFO
 # Provides:          noip
 # Required-Start:    $remote_fs $syslog
 # Required-Stop:     $remote_fs $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Simple script to start a program at boot
 ### END INIT INFO

 #change /direct/path/to/your/application to the path your application is in.
 cd /direct/path/to/your/application      # example cd /home/pi/myprogram/

 #change YourProgramExactName to Exact name of your program that you want to auto start
 ./YourProgramExactName

 exit 0 
  1. Em seguida, salve o arquivo de script na pasta do aplicativo

  2. Em seguida, abra a /home/pi/.config/autostartpasta. Pode ser diferente no seu caso. Basta abrir sua pasta pessoal e ativar a exibição de pastas ocultas. aberto .config/autostart. Se você não vir a pasta de inicialização automática, crie uma pasta chamada inicialização automática na pasta .config.

  3. na pasta de inicialização automática, será necessário criar um atalho para o arquivo de script que você criou da seguinte maneira. Crie um arquivo vazio com extensão .desktop.

  4. Copie e cole o seguinte no arquivo de área de trabalho vazia, exceto que você vai precisar alterar Comment, Name, Exec, Pathe Iconvalor do campo.

    [Desktop Entry]
    Comment=
    Exec=/path/to/Your/application/Name-of-the-script-file (.sh)
    Icon=/Path/to/Your/application/Icon/IconName
    Name=YourApplicationEXACTNAME
    Path=/Path/to/Your/Application-ONLY
    Type=Application
    
  5. Salve e feche o arquivo depois de alterar todos os campos necessários. Você terminou. Apenas teste.

ThN
fonte
Tecnicamente, esse script é executado pelo sistema e não por um usuário específico - então talvez seu aplicativo pertença melhor a /usr/local/bin/ApplicationName...?
SlySven
@SlySven "o sistema" é um usuário específico.
Expiação limitada
É executado como root (UID = 0) ou usuário pi (UID ~ 500 ou 1000 IIRC) - se for executado como root ou outro UID do sistema (menos de 500), tradicionalmente é uma boa prática armazenar o arquivo de script ( ou qualquer um do qual dependa) no dispositivo raiz, para que, caso ocorra algum problema com outro dispositivo (por exemplo, homese esse for um dispositivo separado), não haja problema com o arquivo de script (ou executável) indisponível quando o sistema falha novamente em um único /bin/shshell de usuário ! Hoje em dia a systemdforma como é montar tanto /e /usrantes PID 1 é iniciado ...
SlySven
5

Eu também tive problemas com isso. No Raspberry Pi3 executando o Raspbian, foi o que eu fiz:

  1. Crie um script de shell de inicialização em seu diretório raiz (chamei de "lançamento"):

sudo leafpad launch.sh

  1. Salve o arquivo
  2. Edite o arquivo de inicialização automática do LXDE-pi

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

  1. Adicione isso ao final desse arquivo

./launch.sh

  1. reiniciar
lamarant
fonte
3

No Raspberry Pi3 executando o Raspbian Stretch, foi o que eu fiz:

Edite o arquivo de inicialização automática do LXDE-pi

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

Adicione isso ao final desse arquivo

    @sudo python3 /path/to/your/script.py

salvar e reiniciar

Amr Sohil
fonte
1

Método 1:

Para iniciar um comando automaticamente no login, coloque o comando em um arquivo chamado

.bashrc

no diretório do usuário (por exemplo / home / pi)

.bashrcé não pretende executar scripts.

É executado sempre que um shell interativo sem login é iniciado e é usado para configurar o shell.
~/.bashrc: executed by bash(1) for non-login shells.

Por exemplo, o arquivo pode conter

chromium-browser --kiosk www.google.com

para lançar o Chromium em tela cheia, apontado para www.google.com


Método 2:

Esta solução funciona muito bem. Depois que o navegador carrega, existe um pequeno quadrado preto no canto superior esquerdo da tela que parece ser um bug geral (mencionado em outros fóruns), mas, caso contrário, o modo de tela cheia oculta tudo, exceto a página do navegador.

Edite o arquivo de inicialização automática:

sudo nano /etc/xdg/lxsession/LXDE/autostart 

Comente tudo usando um '#' no início de cada linha e adicione as seguintes linhas

Executar automaticamente o navegador

@xset s off
@xset -dpms
@xset s noblank
@midori -e Fullscreen -a http://google.com

Se necessário, use a ferramenta de configuração para permitir a execução automática da GUI na inicialização

sudo raspi-config

Se você precisar sair de volta ao prompt de comando CTRL+ ALT+F1

CTRL+ ALT+F2

Usuário98764431
fonte
0

Você pode colocar seu script na parte inferior do /etc/profilearquivo.

Outras opções não funcionaram para mim, mas talvez seja porque eu coloquei meu script na área de trabalho.

HelpNeeder
fonte
0

crie um arquivo .sh com os comandos 'python /path/to/your/script.py' type 'sudo nano /etc/rc.local' e digite o caminho para o arquivo .sh

antes

exit 0

Ou você pode simplesmente digitar

crontab -e

ou

sudo crontab -e 

se você deseja que o script seja executado na inicialização

dentro do tipo de arquivo

@reboot python /path/to/your/script.py &
Deepesh
fonte
2
O uso de caminhos completos é fortemente recomendado para entradas do crontab!
Ghanima
-2

ele funciona. (Em cada reinicialização, prepara os seguintes envios automaticamente)

$ cat /etc/rc.local
#!/bin/sh -e
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "1" > /sys/class/gpio/gpio18/value
exit 0
YumYumYum
fonte
-2

É o que geralmente faço.

  1. Armazene seu arquivo no diretório inicial do raspberry pi. Por exemplo: mycode.py
  2. Edite o arquivo:

    sudo nano .bashrc

.bashrcé não pretende executar scripts.

É executado sempre que um shell interativo sem login é iniciado e é usado para configurar o shell.
~/.bashrc: executed by bash(1) for non-login shells.

  1. Vá para o final do arquivo e escreva:

    sudo python mycode.py

  2. Se você deseja que a saída seja armazenada em um arquivo txt, edite o código na Etapa 3 da seguinte maneira:

    sudo python mycode.py >> output.py

Espero que isto ajude!

Doe.John
fonte