Como executar scripts na inicialização?

466

Como posso executar scripts automaticamente quando o Ubuntu é inicializado, então não preciso executá-los manualmente após a inicialização?

    
por myusuf3 04.08.2010 / 21:54
fonte

9 respostas

192

Dependendo do tipo de scripts que você precisa executar. Para serviços e afins, você deve usar o upstart . Mas para um script de usuário, eles devem ser iniciados como scripts de sessão pelo gnome! Dê uma olhada em Sistema > Preferências > Aplicações de inicialização.

Em uma nota lateral, se você precisar que alguns scripts sejam executados no login do terminal, você poderá adicioná-los ao . Bash_login arquivo em seu diretório home.

Para 14.04 e mais velhos

Um comando simples (que não precisa permanecer em execução) poderia usar um trabalho do Upstart como:

start on startup
task
exec /path/to/command

Salve isso em um arquivo .conf em /etc/init (se você precisar dele para ser executado como root quando o sistema for inicializado), ou em ~/.config/upstart (se você precisar dele para executar como seu usuário quando você efetuar login).

    
por LassePoulsen 05.08.2010 / 01:26
fonte
484

Uma abordagem é adicionar uma tarefa @reboot cron :

  1. A execução de crontab -e permitirá que você edite seu cron.
  2. Adicionando uma linha como esta:

    @reboot /path/to/script
    

    executará esse script quando o computador for inicializado.

por ceejayoz 04.08.2010 / 21:57
fonte
140

Que tal adicionar o comando a /etc/rc.local ? você terá que usar o acesso sudo para editar este arquivo.

sudo nano /etc/rc.local
    
por paolo granada lim 05.08.2010 / 18:40
fonte
68

Existem diferentes maneiras de executar comandos automaticamente:

  1. O sistema upstart executará todos os scripts a partir dos quais ele encontrar uma configuração no diretório /etc/init . Esses scripts serão executados durante a inicialização do sistema (ou em resposta a determinados eventos, por exemplo, uma solicitação de desligamento) e, portanto, são o local para executar comandos que não interagem com o usuário; Todos os servidores são iniciados usando esse mecanismo.

    Você pode encontrar uma introdução legível em: link nas páginas man man 5 init e man 8 init você os detalhes completos.

  2. Um script de shell chamado .gnomerc no seu diretório pessoal é automaticamente originado toda vez que você efetua login em uma sessão do GNOME. Você pode colocar comandos arbitrários lá; variáveis de ambiente que você definir nesse script serão vistas por qualquer programa executado em sua sessão.

    Observe que a sessão não inicia até que o script .gnomerc seja concluído; portanto, se você quiser autoinicializar algum programa de execução longa, será necessário incluir & na chamada do programa, para desanexá-lo do shell em execução.

  3. A opção de menu Sistema - > Preferências - > Aplicativos de inicialização permite que você defina quais aplicativos devem ser iniciados quando sua sessão gráfica for iniciada (o Ubuntu predefina bastante) e adicione ou remova-os ao seu gosto. Isso tem quase o mesmo propósito e escopo do script .gnomerc , exceto que você não precisa saber a sintaxe sh (mas também não pode usar nenhuma construção de programação sh ).

por Riccardo Murri 05.08.2010 / 16:02
fonte
54

Para 15.04 e posterior:

Para executar um comando 1 de curta duração na inicialização usando o systemd, você pode usar uma unidade systemd do tipo OneShot . Por exemplo, crie /etc/systemd/system/foo.service contendo:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Em seguida, execute:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Essencialmente, isso é apenas converter um típico trabalho Upstart em um sistema (veja Systemd for Upstart users ).

Você pode executar vários comandos do mesmo arquivo de serviço, usando várias ExecStart lines:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

O comando deve ser sempre dado com o caminho completo. Se algum comando falhar, o resto não será executado. Um - antes de o caminho informar ao systemd para ignorar um status de saída diferente de zero (em vez de considerá-lo uma falha).

Relevante:

Para sessões de usuário, você pode criar a unidade systemd em ~/.config/systemd . Isso deve funcionar com o 16.04 em diante, mas não com versões anteriores do Ubuntu com o systemd (já que elas ainda usam o Upstart para sessões de usuários). As unidades de sessão do usuário podem ser controladas com os mesmos comandos que os serviços do sistema, mas com a opção --user adicionada:

systemctl --user daemon-reload
systemctl --user status foo.service

1 Ao contrário dos daemons de vida longa.

    
por muru 09.01.2016 / 20:21
fonte
23
$HOME/.config/autostart
  • Este local contém a lista de aplicativos de inicialização.
  • O arquivo .desktop pode ser colocado aqui e será executado na inicialização.

Exemplo de exemplo para .desktop file:

Colocando o seguinte arquivo .desktop em $HOME/.config/autostart e recebendo chmod +x :

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Aqui "</path/to/script>" é substituído pelo caminho para seu script.sh
(normalmente recomendado para /usr/local/bin , de forma que pode ser executado pelo comando direto, digamos myscript substituído por "</path/to/script>" ).

Exemplo de exemplo de script.sh :

#!/bin/bash
<commands to be executed>
exit

Resultado: O arquivo .desktop será iniciado a partir de $HOME/.config/autostart , que executa o script por Exec=

Portanto, você pode executar o script de shell desejado na inicialização!

    
por Pandya 20.07.2014 / 08:14
fonte
18

Para coisas simples, você pode adicionar um comando em Sistema- > Preferências- > Sessões apontando para o local do seu script.

Alternativamente, você pode adicioná-lo a /etc/init.d/rc.local ou fazer um trabalho upstart se for mais < em> baixo nível coisas.

Dê uma olhada no link para obter mais informações

    
por tutuca 04.08.2010 / 21:59
fonte
5

Você deve usar o upstart para isso. O Upstart é usado para processos do Ubuntu que são iniciados automaticamente. É uma solução aprimorada como os antigos scripts init.d do System-V. Ele também permite colocar pré-requisitos no início do seu script (ou seja, você precisa da rede em execução? Etc.)

    
por txwikinger 04.08.2010 / 21:58
fonte
3

cron resposta implementada diferente do topo votado

Esta resposta ainda usa cron , mas usa um método diferente do que a resposta mais votada. Isso funciona desde o Ubuntu 16.04, mas provavelmente suportado muito mais cedo. É só que comecei a usar cron para executar trabalhos quando o computador é inicializado desde 16.04.

Quando o cron é executado?

Nos comentários, alguém perguntou "quando eles são exibidos?". Você pode dizer no syslog / journalctl:

$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

Uma coisa a notar é que cron pode enviar por e-mail o status das tarefas executadas e @reboot tarefas executadas tão cedo que o gerenciador de rede e o e-mail não serão executados, a menos que você coloque um comando sleep em seu (s) script (s).

Onde colocar seus scripts

Coloque seus scripts no diretório /etc/cron.d :

$ ll /etc/cron.d
total 44
drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r--   1 root root   244 Dec 28  2014 anacron
-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background
-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness
-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder
-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz
-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

Como é um script?

Aqui estão alguns scripts que eu configurei para executar cada inicialização:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"'uname -r'
    
por WinEunuuchs2Unix 03.01.2018 / 02:02
fonte