Como executar scripts na inicialização?


520

Como posso executar scripts automaticamente quando o Ubuntu é iniciado, para que eu não precise executá-los manualmente após a inicialização?


3
Se alguém também pudesse mostrar WHEN e WHERE, isso seria incrível. Digo isso porque eu sei que há pelo menos 2 maneiras para iniciar um script que irá disparar antes de outros aplicativos foram iniciados (como X11)
Buttink

1
Todo esse segmento de resposta está uma bagunça. O formato do Stack Exchange não parece ser o mais adequado para esta pergunta
Gabriel Fair

1
É realmente muito divertido. Quantas maneiras diferentes poderiam existir?
Devios1 15/05

Respostas:


206

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

Além disso, se você precisar que alguns scripts sejam executados no logon do terminal, poderá adicioná-los ao arquivo .bash_login no diretório inicial.

Para 14.04 e mais velhos

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

start on startup
task
exec /path/to/command

Salve isso em um .confarquivo /etc/init(se você precisar executar como root quando o sistema inicializar) ou em ~/.config/upstart(se você precisar executar como seu usuário ao efetuar login).


58
Considerando como o SO e o StackExchange são executados, você poderia dar um exemplo de um script inicial e onde ele seria colocado? Isso tornaria essa uma resposta muito melhor. Seu link diz que ele não está sendo mantido e que você deve ler o livro de receitas mais recente, que é imenso. Não tenho muita idéia por onde começar.
Ehtesh Choudhury

2
E se eu precisar executar o comando como root?
Dopatraman 15/07/2015

1
@dopatraman A resposta afirma que todos os processos com isso são executados como raiz.
AStopher 24/10/2015

4
Atualize esta resposta para explicar o que fazer em sistemas executando systemd em vez de inicializar (Ubuntu 15.04+).

3
Esta resposta não faz sentido para mim. Os aplicativos listados em system->pref->startup applicationsnão podem ser encontrados /etc/init/nem em ~/.config/upstart. Então, onde os aplicativos de inicialização são definidos?
precisa saber é

553

Uma abordagem é adicionar uma tarefa cron do @reboot :

  1. A execução crontab -epermitirá que você edite seu cron.
  2. Adicionando uma linha como esta a ela:

    @reboot /path/to/script
    

    executará esse script assim que o computador for inicializado.


85
A @rebootpalavra-chave é uma ótima dica, porque não é amplamente conhecida.
precisa saber é o seguinte

12
Agradável. Alguma idéia exatamente quando isso desencadeia?
Oli

2
Então ... isso não funcionaria se eu perdesse energia e o PC voltasse quando a energia fosse restaurada?
Mike Wills

18
@siamii: man 5 crontabdiz que @rebooté executado na inicialização (quando o cron daemon é iniciado).
jfs

9
Isso é incrível. Até agora, isso parece melhor do que rc.localjá que o sistema parece mais configurado por este ponto (PATH, etc). É estranho que é tão difícil para chamar algo após a inicialização do sistema ..
Karthik T

161

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

sudo nano /etc/rc.local

19
Isso responde mais diretamente à pergunta: como simplesmente executar alguns scripts quando o sistema é inicializado. o upstart executa uma tarefa mais complexa: inicia os processos do daemon.
Dogweather

1
Então, o iniciante inicia os processos do daemon enquanto o /etc/rc.local inicia os scripts bash?
Donato

5
Deveria? Isso não funciona mais nos dias de hoje, certo?
DaVince 28/04

4
Trabalho doenst com o Ubuntu 17.04 systemd
qodeninja

3
Observe que, se você mesmo criar este arquivo (como eu fiz), será necessário alterar o arquivo para executável com chmod 755 rc.locale adicionar #!/bin/bashà primeira linha.
Psitae 2/08

77

Para 15.04 e posterior:

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

[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 está apenas convertendo um trabalho Upstart típico em um systemd (consulte Systemd para usuários do Upstart ).

Você pode executar vários comandos no mesmo arquivo de serviço, usando várias ExecStartlinhas:

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

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

Relevante:


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

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

Sintaxe do shell

Observe que, ao contrário do Upstart, o systemd não executa os Exec*comandos através de um shell. Ele realiza alguma expansão limitada de variáveis ​​e vários comandos (separados por ;) em si, mas é isso que diz respeito à sintaxe do shell. Para algo mais complicado, como redirecionamento ou pipes, coloque seu comando em sh -c '...'ou bash -c '...'.


1 Ao contrário de demônios de longa vida.


é possível definir uma prioridade no trabalho? ou especificar que depende de outro serviço para ser iniciado primeiro?
R3wt

1
@ r3wt sim, existem diferentes maneiras de fazer isso. O WantedByusado aqui, por exemplo, inicia quando o multi-user.targetalcance é alcançado. Você pode usar Before, After, Requires, etc. Vejaman systemd.unit
Muru

@PerlDuck não é a única coisa que faltava. Obrigado!
Muru

De nada. - RemainAfterExitDepende do serviço que você inicia e do comportamento desejado. Por exemplo, /bin/df -h<s> teria </s> deveria ter RemainAfterExit=no.
PerlDuck # 03

@PerlDuck Não há nada inerente a dfessas necessidades RemainAfterExit=no. A menos que você queira executar repetidamente o comando toda vez que executar systemctl start foo.
Muru

71

Existem diferentes maneiras de executar comandos automaticamente:

  1. O novo-rico sistema executará todos os scripts a partir do qual 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 nas páginas de manual man 5 inite man 8 initfornecendo todos os detalhes.

  2. Um script de shell nomeado .gnomercem seu diretório pessoal é originado automaticamente sempre que você faz login em uma sessão do GNOME. Você pode colocar comandos arbitrários lá; As variáveis ​​de ambiente que você definir neste script serão vistas por qualquer programa executado em sua sessão.

    Observe que a sessão não inicia até que o .gnomercscript seja finalizado; portanto, se você deseja iniciar automaticamente algum programa de longa execução, é necessário anexar &à invocação do programa para desanexá-lo do shell em execução.

  3. A opção de menu Sistema -> Preferências -> Aplicativos de inicialização permite definir quais aplicativos devem ser iniciados quando a sessão gráfica é iniciada (o Ubuntu pré-define alguns) e adicioná-los ou removê-los a seu gosto. Isso tem quase o mesmo objetivo e escopo do .gnomercscript, exceto que você não precisa conhecer a shsintaxe (mas também não pode usar nenhuma shconstrução de programação).


11
3) "Isso tem quase o mesmo objetivo e escopo do script .gnomerc", exceto que .gnomercaparentemente é executado antes de carregar o Unity e, Startup Applicationsaparentemente, é executado após o carregamento do Unity. Eu tive que executar um programa que fica na barra de menus do Unity e isso fez uma enorme diferença neste caso!
Aquele cara brasileiro

1
@ ruda.almeida Obrigado por apontar isso. A resposta foi escrita nos dias anteriores à Unidade.
Riccardo Murri 23/01

1
sudo update-rc.d myscript.sh defaults, onde /etc/init.d/myscript.sh é o seu script, também o executa na inicialização.
Dan Dascalescu 9/08/16

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

Exemplo de exemplo para o .desktoparquivo:

Colocando o seguinte .desktoparquivo $HOME/.config/autostarte fornecido 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 o seu script.sh
(geralmente recomendado para /usr/local/binque possa ser executado pelo comando diretamente, diga myscriptsubstituído por "</path/to/script>").

Exemplo de exemplo de script.sh:

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

Resultado: o .desktoparquivo será iniciado a partir do $HOME/.config/autostartqual executar o scriptExec=

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


18

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

Como alternativa, você pode adicioná-lo ao /etc/init.d/rc.local ou fazer um trabalho inicial se for algo de nível mais baixo .

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


7

cron resposta implementada diferente do top votado

Essa resposta ainda usa, cronmas usa um método diferente do que a resposta votada principal. Isso funciona desde o Ubuntu 16.04, mas provavelmente é suportado muito mais cedo. Só que comecei a usar cronpara executar trabalhos quando o computador é inicializado desde 16.04.

Quando cronfunciona?

Nos 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 observar é cronque você pode enviar por e-mail o status dos trabalhos executados e os @reboottrabalhos executados para que o gerente de rede e o email iniciais não sejam executados, a menos que você insira um sleepcomando no (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`

1
Existem muitas maneiras diferentes de adicionar cronjobs, mas o núcleo da resposta altamente votada e sua resposta ainda é a @reboot.
muru

Métodos alternativos para adicionar crontabs devem ser publicados em askubuntu.com/q/2368/158442 , que é explicitamente sobre a adição de trabalhos Cron.
muru

1
Eu peço desculpa mas não concordo. O núcleo da resposta em questão utiliza crontab -ealguns que consideram uma das artes negras devido a uma interface semelhante a vim. Por outro lado, essa resposta pode atrair aqueles cujos cérebros estão conectados de uma certa maneira. Nem todos somos moldados do mesmo molde. Então, novamente, esta resposta já tem um voto negativo, por isso vamos deixar a democracia seguir seu curso.
WinEunuuchs2Unix

2
Oh, por favor. Você e eu sabemos que o editor pode ser alterado.
muru

@ muru Sim, provavelmente porque você me ensinou e eu aprendi a mudar o editor para algo como nano ou algumas outras CLI. Mas estou no campo de gedit. Além disso, crontab -etraz à tona memórias de asteriscos ("*") por minutos, horas, etc., que eu sempre achei necessário pesquisar no google. Ainda acho o uso /etc/cron.de a /etc/cron.dailyminha opção. Especialmente porque espelha /etc/udev/rules.de /etc/systemd/system-sleepmétodos. Parece um bom ajuste.
WinEunuuchs2Unix

5

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.