ti-enxame.com

Como executar scripts no arranque?

Como posso executar scripts automaticamente quando o Ubuntu inicia, então eu não tenho que executá-los manualmente após a inicialização?

497
myusuf3

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

Se você precisar que alguns scripts sejam executados no login do terminal, você pode adicioná-los ao arquivo . Bash_login em seu diretório pessoal.

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 que ele seja executado como usuário quando você efetuar login).

200
LassePoulsen

Uma abordagem é adicionar uma tarefa @reboot cron :

  1. Rodar crontab -e permitirá que você edite seu cron.
  2. Adicionando uma linha como esta:

    @reboot /path/to/script
    

    irá executar esse script assim que o seu computador inicializar.

531
ceejayoz

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

Sudo nano /etc/rc.local
154
paolo granada lim

Existem diferentes maneiras de executar comandos automaticamente:

  1. O sistema pstart executará todos os scripts a partir dos quais ele encontra 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: http://upstart.ubuntu.com/getting-started.html as páginas de manual man 5 init e man 8 init fornecem detalhes completos.

  2. Um script 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, a fim de desanexá-lo do Shell em execução.

  3. A opção do menu System -> Preferences -> Startup Applications 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 qualquer construção de programação sh).

70
Riccardo Murri

Para 15.04 e posterior:

Para executar um (curta duração)1 comando na inicialização usando 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

Então corra:

Sudo systemctl daemon-reload
Sudo systemctl enable foo.service

Essencialmente, isso é apenas converter m típico trabalho Upstart para um systemd (veja Systemd para usuários Upstart ).

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

[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

Sintaxe da Shell

Note que, ao contrário do Upstart, o systemd não executa os comandos Exec* através de um Shell. Ele executa uma expansão de variável limitada e um comando múltiplo (separado por ;), mas é sobre a sintaxe Shell. Para qualquer coisa mais complicada, digamos redirecionamento ou pipe, envolva seu comando em sh -c '...' ou bash -c '...'.


1Ao contrário de daemons de vida longa.

66
muru
$HOME/.config/autostart
  • Este local contém a lista de aplicativos de inicialização.
  • .desktop arquivo pode ser colocado aqui que será executado na inicialização.

Exemplo de exemplo para o arquivo .desktop:

Colocando o seguinte arquivo .desktop em $HOME/.config/autostart e dado 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 por um caminho para seu script.sh
(geralmente recomendado para /usr/local/bin so-that pode ser executado por comando direto diga 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!

27
Pandya

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 pstart se for mais nível baixo coisa.

Dê uma olhada em https://help.ubuntu.com/community/UbuntuBootupHowto para mais informações

18
tutuca

Você deve usar pstart 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 script (ou seja, você precisa da rede em execução? Etc.)

5
txwikinger

cron answer implementado diferente do top votado

Essa 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 eu comecei a usar o cron para executar tarefas quando o computador é inicializado desde 16.04.

Quando o cron é executado?

Em comentários alguém perguntou "quando eles correm?". 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`
3
WinEunuuchs2Unix