Como iniciar um aplicativo automaticamente na inicialização

27

Eu sou novo no Linux e estou ansioso para iniciar o aplicativo (que alterna um led a cada 10 s). Eu escrevi o programa de aplicação e está funcionando bem, mas agora quero iniciá-lo automaticamente na inicialização.

A documentação aqui diz para copiar o script de inicialização no /etc/init.ddiretório e criar um link simbólico para o script copiado no rc.ddiretório.

Qual deve ser a extensão e o nome desses arquivos de script? Podemos adicionar manualmente o link simbólico rc.dou existe algum procedimento específico para isso?

Alguma sugestão de como conseguir isso?

desfiladeiro
fonte
A maneira preferida de adicionar um script init à inicialização varia de acordo com as distribuições. Alguns estão até eliminando-os em favor do iniciante e do systemd. Eu não recomendaria simplesmente usar "&" como pano de fundo, pois algo como o Debian start-stop-daemonlida com isso melhor (embora seja preferível que o próprio programa daemonize). Que distro você está usando? Fora dos tipos MIME da área de trabalho, as extensões de arquivo não fazem sentido no * nix e é preferível que os executáveis ​​não tenham um.
jordanm
Se você estiver usando o petalogix, basta seguir a documentação - nenhum nome especial é necessário, basta fazer o que eles dizem. Você tentou? Que problemas você está tendo? (Se não, por favor, indique a sua distro e explicar o que não funciona com o que você tentou.)
Mat
Estou usando o Debian “wheezy” para RPi.
Gorge #
11
se você precisar fazer aproximadamente a cada 10 segundos (ou seja, não 10 segundos em ponto), convém usá-lo cron.
Peterph 28/11/2012
@ Peter: mas parece que o programa alterna o LED a cada 10 segundos, não um programa que é executado a cada 10 segundos.
Zorawar #

Respostas:

19

Aqui está o trecho de http://www.debian-administration.org/articles/28 que parece responder à sua pergunta.

Nota: No script de exemplo abaixo, basta adicionar uma chamada à seção " start)" para realmente iniciar seu programa. Você pode testar a funcionalidade do script sem reiniciar o sistema: chame-o com o caminho completo e dê a ele um parâmetro " start" ou " stop"

Aqui vai:

O Debian usa um sistema init como o Sys-V para executar comandos quando o nível de execução do sistema muda - por exemplo, no momento da inicialização e do desligamento.

Se você deseja adicionar um novo serviço para iniciar quando a máquina inicializar, adicione o script necessário ao diretório /etc/init.d/. Muitos dos scripts já presentes nesse diretório fornecem um exemplo do tipo de ação que você pode fazer.

Aqui está um script muito simples, dividido em duas partes: código que sempre é executado e código que é executado quando chamado com "start" ou "stop".

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Depois de salvar seu arquivo no local correto, verifique se ele é executável executando " chmod 755 /etc/init.d/blah".

Em seguida, você precisa adicionar os links simbólicos apropriados para fazer com que o script seja executado quando o sistema for desativado ou for ativado.

A maneira mais simples de fazer isso é usar o comando específico do Debian update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah
Alexander Shcheblikin
fonte
preciso colocar esse script em etc / init.d / ou a linha na parte superior, # /etc/init.d/blah, indica um local para o shell?
user137717
Estou recebendo "-sh: update-rc.d: comando não encontrado"
m4l490n
2
Os sistemas mais recentes empregam systemdmuitas coisas, inclusive na configuração de inicialização. Use systemctlpara controlar e configurar systemd.
Alexander Shcheblikin
4

A melhor maneira é verificar a origem do pacote da sua distribuição para um serviço regular do sistema, por exemplo, para o OpenSSH - você verá quais são as boas práticas. Afinal, uma das razões por trás do código aberto é poder aprender com os fontes.

peterph
fonte
2
Excelente conselho! Verdadeiramente sábio e relevante, e sintonizado em todos os Distos. (E aliás responde à parte "nova no Linux" e "como eu faço" da pergunta.
Usarei
3

Use o Supervisor, um programa eficaz que gerencia e registra os aplicativos de inicialização com argumentos. Saiba mais em http://supervisord.org/running.html e (Siga as instruções de instalação.

Crie um arquivo conf em /etc/supervisor/conf.d/{PROGRAM_NAME}.confe Aqui está o código,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Em seguida, execute a partir da linha cmd:

supervisorctl reload

Cosmo Arun
fonte
Considerando a sua resposta é bom, eu acho que você deve alterá-lo para mostrar que "reload supervisorctl" é para ser executado a partir do CLI, para não ser inserido no arquivo .conf
dlewin
3

Usar crontabé muito mais fácil.

Use crontab -epara editar o crontab do usuário.
Adicione a seguinte linha no final:

@reboot <command>

Exemplos:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Por fim, use crontab -lpara garantir que seu script foi adicionado à lista.

Jithin Pavithran
fonte
Eu me pergunto por que essa resposta recebeu votos negativos? Parece uma solução muito simples e que usa o crontab - que provavelmente todo mundo já conhece e já entende.
kolinko 19/04
1

Versões mais recentes do suporte ao linux systemd(como disse @AlexanderShcheblikin). Possui mais recursos e é mais portátil que a solução específica do debian.

Por favor, leia este realmente ótimo guia .

Aqui está uma referência rápida do mínimo necessário:

  1. Um script (por exemplo myscript.sh) com permissões executáveis.
  2. Um arquivo de unidade (por exemplo myservice.service) com extensão ".service" /etc/systemd/systemcom permissões 644 que contém o comando para executar o script. Por exemplo,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Execute o comando sudo systemctl enable myservicepara permitir que ele inicie na inicialização.
mareoraft
fonte