Executar script no start-up

Eu estou tentando executar um script quando meu Raspberry Pi é inicializado. Eu gostaria que o navegador da web se abrisse automaticamente.

Eu tentei encontrar uma solução simples, (como soltar meu script em algum diretório de "inicialização" ou algo similar), mas eu não estou vendo nada parecido.

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

151
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 distros do Linux possuem diferentes métodos recomendados. Se você está rodando X nele, então você deve procurar adicionar coisas ao seu arquivo .xinitrc ou .xsession .
adicionado o autor ghoti, fonte
Mais informações sobre o processo de inicialização do X podem ser encontradas aqui .
adicionado o autor ghoti, fonte
Por favor note que a resposta aceita aqui tem algumas ressalvas e tecnicamente não inicia qualquer coisa na inicialização, exceto sob condições específicas. Leia atentamente.
adicionado o autor goldilocks, fonte
Você está solicitando um script que é executado quando você faz login, não quando o pi é inicializado ou quando é iniciado. Duas muito coisas diferentes, e o título está distorcendo os resultados da pesquisa do google.
adicionado o autor IAmNaN, fonte

12 Respostas

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


Você pode adicionar seu comando executável de script à parte inferior do .bashrc que executará seu script toda vez que você efetuar login .

  1. Make sure you are in the pi folder:

    $ cd ~
    
  2. Create a file and write a script to run in the file:

    $ sudo nano superscript
    
  3. Save and exit: Ctrl+X, Y, Enter

  4. Open up .bashrc for configuration:

    $ sudo nano .bashrc
    
  5. Scroll down to the bottom and add the line: ./superscript

  6. Save and exit: Ctrl+X, Y, Enter


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

  1. Create a file for your startup script and write your script in the file:

    $ sudo nano /etc/init.d/superscript
    
  2. Save and exit: Ctrl+X, Y, Enter

  3. Make the script executable:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Register script to be run at startup:

    $ sudo update-rc.d superscript defaults
    

If you want a script to run when you boot into the LXDE environment, you could take a look at this Raspberry Pi forum post:

  1. Navigate to ~/.config/lxsession/LXDE-pi

  2. Open the autostart file in that folder:

    $ sudo nano autostart
    
  3. Add @midori on a new line. If you want to run something like a python script, put something like @python mypython.py on a new line. Running a script file would be @./superscript, but for some reason the script runs in an infinite loop (perhaps this will stop that).

  4. Save and exit: Ctrl+X, Y, Enter

  5. Restart your Raspberry Pi into the LXDE environment.

153
adicionado
.bashrc nã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). Fico perplexo com o fato de essa resposta ter tantas votações: a primeira parte está totalmente errada . A terceira parte está correta para executar um programa GUI.
adicionado o autor Chris Smith, fonte
@ syb0rg Através de uma GUI. E você precisa fazer o login primeiro se o login automático não estiver ativado.
adicionado o autor Chris Smith, fonte
@GeorgeProfenza Eu editei em um link para fechar um script quando está pronto, talvez isso ajude.
adicionado o autor mrrage, fonte
@Gilles Um novo terminal é aberto na inicialização ... de que outra forma você iria interagir com o sistema operacional?
adicionado o autor mrrage, fonte
@AnnonomusPerson Coloque esse comando em um script e execute o script na inicialização.
adicionado o autor mrrage, fonte
@GeorgeProfenza eu editei em uma nova seção dedicada só para você :)
adicionado o autor mrrage, fonte
@GeorgeProfenza Quando você faz $ sudo startx ?
adicionado o autor mrrage, fonte
Para o LXDE, consulte raspberrypi-spy.co.uk/2014/05/…
adicionado o autor Samuel, fonte
@ syb0rg Tão perto :) O método LXDE/autostart funciona, embora executar o @ ./supercript (no meu caso ./svnc onde eu ligo o tightvncserver) tem um efeito colateral estranho: o script é executado repetidas vezes e eu recebo vários servidores vnc lançados afogando continuamente o sistema. Como uma solução mais segura, depois de ler este post instalado avahi então agora é mais fácil fazer o login via ssh, e então iniciar o servidor vnc. Seria útil saber para evitar o loop de script com o método
adicionado o autor paan, fonte
@ syb0rg Usando o raspi-config , o raspian é configurado para inicializar com a interface gráfica. Eu não tenho certeza como isso é feito nos bastidores (se sudo startx for executado ou simplesmente startx) porque eu vejo a interface gráfica, mas o script não roda. No entanto, quando eu ssh no RPi, o script começa.
adicionado o autor paan, fonte
Só queria salientar que o script pyhton será executado, mas se houver algum erro, ele estará em algum lugar em segundo plano usando o método/etc/xdg/lxsession/LXDE/autostart. Usar o .barshrc também revelará erros, mas é muito importante ter certeza de que o script é justo em primeiro lugar (descobri isso da maneira mais difícil :))
adicionado o autor paan, fonte
@AnnonomusPerson Eu pretendia lançar meu script python na inicialização do LXDE, sim, mas os métodos apresentados acima funcionam para iniciar um script bash ou qualquer outro aplicativo instalado no RPi
adicionado o autor paan, fonte
@ syb0rg A execução na parte de login funciona como um encanto (+1) se eu fizer login via ssh, mas não quando a sessão de área de trabalho lxde for iniciada. Existe uma maneira de fazer isso?
adicionado o autor paan, fonte
Eu estou recebendo a seguinte mensagem, depois de adicionar o script em .bashrc, quando eu abrir meu lxterminal bash: ./main: Permission denied
adicionado o autor Brian Surowiec, 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.
adicionado o autor Tyler Murry, fonte
Qual seria o código se você quer apenas executar um comando quando o RPi é iniciado? Eu estou usando o método do meio e para fazer isso normalmente eu digite: $ sudo /opt/jdk1.8.0/bin/java -Xms256M -Xmx496M -jar /home/pi/spigot.jar nogui
adicionado o autor Anonymous Penguin, fonte
@GeorgeProfenza Então é um script python?
adicionado o autor Anonymous Penguin, fonte
Parte disso é que eu acredito desatualizado - o caminho /etc/xdg deve ser /etc/xdg/lxsession/LXDE-pi ; editado para refletir isso.
adicionado o autor goldilocks, fonte
o truque .bashrc só funciona se você abrir uma janela de terminal (e toda vez que abrir outra janela de terminal). Em contraste, se você apenas esperar até que o shell gráfico seja lançado, nada acontece.
adicionado o autor bvdb, fonte
E se meu script python precisar ser executado como sudo?
adicionado o autor Script Kitty, fonte
Como posso autenticar o usuário root na inicialização, não efetuar login?
adicionado o autor Script Kitty, fonte

A maneira que eu vi a maioria das pessoas fazendo isso (dê uma olhada nos fóruns do Raspberry Pi), e fiz sucesso com sucesso está usando o /etc/rc.local .

Tudo que você precisa fazer aqui é colocar ./myscript no 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 similar)" - talvez pesquisar nos fóruns quando você está tendo dúvidas também, essa solução surgiu nos primeiros 4 resultados de um pesquisa do Google!

32
adicionado
@ ErickM.Sprengel Use uma das respostas corretas neste tópico, como esta .
adicionado o autor Chris Smith, fonte
Isso não é bom para um programa GUI, como um navegador. /etc/rc.local é apenas para iniciar serviços do sistema (programas que não possuem uma interface de usuário).
adicionado o autor Chris Smith, fonte
adicionado o autor Samuel, fonte
FYI o rc.local por padrão tem vários comentários sobre o script não fazer nada e precisar de bits executáveis ​​alterados. Isso não é verdade, apenas insira o comando para seu script antes da saída 0 e ele será executado na inicialização. Certifique-se de que o script saia de execuções em segundo plano ou bloqueie o prompt de login. Sim, foi o que eu fiz.
adicionado o autor rob, fonte
@rob Você quer dizer que eles sugerem que o script seja definido como executável? Isto é mitigado na questão executando o script pelo comando python myscript.py . Se você quiser chmod + x e adicione #!/bin/python , você pode executar o script fazendo $ pathtofile/myscript.py onde $ pathtofile é . se você estão no mesmo diretório ou no caminho absoluto ou relativo para o arquivo.
adicionado o autor JFA, fonte
@JFA execute "ls -l /etc/rc.local" que mostrará se o arquivo é executável ou não, procure o "x" na lista de permissões.
adicionado o autor rob, fonte
@rob sim eu entendo como isso funciona. Eu estava tentando esclarecer seu post.
adicionado o autor JFA, fonte
Embora isso funcione perfeitamente no meu Pi 1 B +, ele não funcionará no meu Pi 3 por algum motivo desconhecido, executando exatamente o mesmo script (que será executado manualmente em ambos). Não sei por que não está trabalhando no Pi 3.
adicionado o autor Gabriel Staples, fonte
Corrigido (fonte: elinux.org/RPi_Email_IP_On_Boot_Debian ) Eu adicionei sleep 30 após o último comentar em /etc/rc.local , antes de qualquer código de script, e agora meu script é executado corretamente.
adicionado o autor Gabriel Staples, fonte
E os scripts que precisam de sudo? ie. noip?
adicionado o autor ampofila, fonte
@Gilles Eu estou procurando exatamente por um programa GUI. Você tem uma sugestão? (Eu gostaria de começar o Kodi)
adicionado o autor Erick M. Sprengel, fonte

Adicione-o ao crontab

O crontab executa comandos em horários definidos.


Edite o arquivo:

sudo crontab -e

Adicionar linha ao arquivo (aqui um script python):

@reboot python3 /home/pi/Desktop/exemple.py &
19
adicionado
Isso não é bom para um programa GUI, como um navegador. /etc/rc.local é apenas para iniciar programas que não possuem uma interface de usuário.
adicionado o autor Chris Smith, fonte
Para ser um pouco incoerente aqui, tecnicamente não é crontab que executa o comando, mas de qualquer maneira. Com relação à linha listada para adicionar, é aconselhável colocar caminhos completos para os comandos definidos aqui (neste caso, o caminho completo para python3 ), veja aqui
adicionado o autor Ghanima, fonte
Este é o método que eu sempre usei devido a sua simplicidade. +1
adicionado o autor Patrick Cook, fonte
Depois de passar muito tempo tentando fazê-lo funcionar com rc.local e init.d e todos os outros tipos de coisas .. isso funcionou imediatamente! Muito obrigado!
adicionado o autor ppumkin, fonte

Eu quero jogar meus dois centavos, mesmo que esta seja uma pergunta antiga, mas comumente pedida para fazer uma coisa simples - autostart. Eu tentei todas as soluções sugeridas em todas as respostas para esta questão. Nenhum deles funcionou para mim. Eu estou usando Raspberry PI Model 2 com Raspbian.

A única maneira que eu poderia conseguir meu aplicativo para iniciar automaticamente com êxito é através de um script da seguinte maneira. Eu digo com sucesso porque meu aplicativo começou como esperado sem ter qualquer problema, como iniciar com o caminho de trabalho errado.

1.Crie um arquivo vazio com extensão .sh e nomeie o que você quiser.

2.Copie e cole o seguinte EXATAMENTE, exceto alterar "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. Then, save the script file within your application folder

  2. Then, open /home/pi/.config/autostart folder. It might be different in your case. Just open your home folder and enable view hidden folders. open .config/autostart. If you don't see autostart folder, then create a folder called autostart within .config folder.

  3. within autostart folder you will need to create a shortcut to your script file that you created as follows. Create an empty file with extension .desktop.

  4. Copy and paste the following in the empty desktop file except you will need to change Comment, Name, Exec, Path and Icon field's value.

    [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. Save and close the file after changing all the necessary fields. You are done. Just test it out.

6
adicionado
Tecnicamente, este script é executado pelo sistema, e não por um usuário específico - então, talvez o seu aplicativo seja mais adequado em /usr/local/bin/ApplicationName ...?
adicionado o autor SlySven, fonte

Aplicativos xorg de inicialização automática

Se o script que você deseja iniciar requer uma sessão do xorg, você pode tentar seguir o especificação autostart freedesktop que pode ou não funcionar dependendo do seu ambiente.

Como alternativa, você pode segmentar 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 de um 'serviço', e seu sistema está executando systemd que é o caso dos linuces raspbian e mais modernos, então você pode configurar seu script para ser executado como um serviço systemd - isso fornece controle granular sobre o ciclo de vida e o ambiente de execução, bem como condições prévias para iniciar o script, como a rede em funcionamento. Também é possível configurar a reinicialização do serviço em caso de falha ( Restart = always e demora entre reiniciar, 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 como esperado, habilite-o com:

systemctl enable autossh

NOTE: For security purposes systemd will run the script in a restricted environment, similar to how crontab scripts are run, therefore don't make any assumptions about pre-existing system variables. Use the Environment keys if your script needs specific variables to be defined. Adding set -x at the top of your bash script and then running systemctl status my_service might help identify why your script is failing. As a rule of tumb, always use absolute paths for everything including echo and cat, or explicitly define your $PATH.

4
adicionado

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

  1. Crie um script de shell de inicialização em seu diretório raiz (denominei o meu "launch"):

sudo leafpad launch.sh

  1. Salve o arquivo
  2. Edite o arquivo de autostart do LXDE-pi

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

  1. Adicione isso ao final desse arquivo

./ launch.sh

  1. reinicializar
4
adicionado

Isso é o que geralmente faço.

  1. Store your file in the raspberry pi home directory. Eg: mycode.py
  2. Edit the file:

    sudo nano .bashrc

  3. Go to the end of the file and write:

    sudo python mycode.py

  4. If you want the output to be stored in a txt file, edit the code in Step 3 as follows:

    sudo python mycode.py >> output.py

Espero que isto ajude!

2
adicionado

FUNCIONA. (Em todas as reinicializações, preparar as seguintes submissões automáticas)

$ 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
2
adicionado

No Raspberry Pi3 rodando 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

save & reboot

1
adicionado

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

antes

exit 0

Ou você poderia simplesmente digitar

crontab -e

ou

sudo crontab -e 

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

dentro do tipo de arquivo em

@reboot python /path/to/your/script.py &
0
adicionado
O uso de caminhos completos é fortemente encorajado para entradas de crontab!
adicionado o autor Ghanima, fonte

Você poderia colocar seu script na parte inferior do arquivo /etc/profile .

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

0
adicionado

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)

Por exemplo, o arquivo pode conter

chromium-browser --kiosk www.google.com

para iniciar o Chromium em tela cheia apontada para www.google.com.br


Método 2:

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

Edite o arquivo de autoinicialização:

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

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

Auto executar 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 ativar a execução automática da GUI no powerup

sudo raspi-config

If you need to exit back to the command prompt CTRL + ALT + F1

CTRL + ALT + F2

0
adicionado