Como executar scripts na inicialização?

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

Uma abordagem é adicionar um @ reboot cron tarefa:

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

    @reboot /path/to/script

    executará esse script assim que o computador inicializar.

Dependendo do tipo de scripts que você precisa executar.. Para serviços e similares você deve usar arrivista. Mas para um script de usuário, eles devem ser iniciados como scripts de sessão pelo gnome! Dê uma olhada no sistema & gt; Preferências & gt; Aplicativos de inicialização.

Em uma nota lateral se você precisar de alguns scripts para serem executados no Login do terminal, você pode adicioná-los ao .bash_login arquivo em seu diretório inicial.

Para 14.04 e mais velhos

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

start on startuptaskexec /path/to/command

Salve isso em um .conf arquivo em /etc/init (se você precisar que ele seja executado como root quando o sistema for inicializado) ou em ~/.config/upstart (se você precisarpara Executar como seu usuário ao fazer login).

Você pode adicionar comandos a /etc/rc.local:

sudo nano /etc/rc.local

Isso executa os comandos como root.

Para executar comandos como um usuário específico, use sudo -i -u (-i para também executar o shell de login). Por exemplo, para estabelecer um túnel SSH persistente, onde myhost é definido em johndoes ~/.ssh/config arquivo:

sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost

Observe que se /etc/rc.local não existia (como é o caso no Ubuntu desde 16.04), você precisa adicionar um linha shebang no topo (por exemplo. #!/bin/bash), e garantir que o arquivo é executável:

sudo chmod a+x /etc/rc.local

Para 15.04 e mais tarde:

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

[Unit]Description=Job that runs your user script[Service]ExecStart=/some/commandType=oneshotRemainAfterExit=yes[Install]WantedBy=multi-user.target

Executar:

sudo systemctl daemon-reloadsudo systemctl enable foo.service

Essencialmente, isso é apenas converter um trabalho típico de iniciante para um systemd um (ver Systemd para usuários iniciantes).

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

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

O comando deve sempre ser dado com o caminho completo. Se algum comando falhar, o resto não será executado. A - antes que o caminho diga 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 Sim. Isso deve funcionar com 16.04 em diante, mas não versões anteriores do Ubuntu com systemd (já que aqueles ainda usavam o Upstart para sessões de usuário). As unidades de sessão do usuário podem ser controladas com os mesmos comandos que com os Serviços de sistema, mas com o --user Opção adicionada:

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

Sintaxe do Shell

Observe que, ao contrário do Upstart, systemd não executa o Exec* comandos através de um shell. Ele executa alguma expansão variável limitada e comando múltiplo (separado por ;) em si, mas isso é sobre isso no que diz respeito à sintaxe semelhante a shell. Para qualquer coisa mais complicada, diga redirecionamento ou pipes, envolva seu comando em sh -c '...' ou bash -c '...'.


1Em oposição aos daemons de longa duração.

Existem diferentes maneiras de executar comandos automaticamente:

  1. O arrivista o sistema executará todos os scripts a partir dos quais encontra uma configuração no diretório /etc/init. Esses scripts serão executados durante a inicialização do sistema (ou em resposta a certos eventos, por exemplo, uma solicitação de desligamento), assim como 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 para em: http://upstart.ubuntu.com/getting-started.html the man pages man 5 init e man 8 init dê-lhe os detalhes completos.

  2. Um script shell chamado .gnomerc em seu diretório inicial é originado automaticamente cada vez que você faz login em uma sessão do GNOME. Você pode colocar comandos arbitrários lá; variáveis de ambiente que você definiu neste script serão vistas por qualquer programa que você executar em sua sessão.

    Observe que a sessão não começa até que o .gnomerc script está terminado; portanto, se você quiser iniciar automaticamente algum programa de longa duração, você precisa anexar & para a invocação do programa, a fim de destacá-lo do shell em execução.

  3. Menu Sistema - & gt; Preferências - & gt; Aplicativos de inicialização permite definir quais aplicativos devem ser iniciados quando sua sessão gráfica é iniciada (o Ubuntu predefina alguns) e adicioná-los ou removê-los ao seu gosto. Isso tem quase o mesmo propósito e escopo do .gnomerc script, exceto que você não precisa saber sh sintaxe (mas você também não pode usar nenhum sh construção de programação).

$HOME/.config/autostart contém a lista de aplicativos de inicialização. .desktop os arquivos nesta pasta serão executados na inicialização. Pode precisar de permissão executável (chmod +x startup.desktop).

Exemplo de exemplo para .desktop arquivo:

[Desktop Entry]Type=ApplicationExec="</path/to/script>"Hidden=falseNoDisplay=falseX-GNOME-Autostart-enabled=trueName=Startup Script

Aqui "</path/to/script>" é substituído por caminho para o seu script.shSe você colocar seu script myscript em /usr/local/bin para que possa ser executado diretamente pelo comando, você pode escrever myscript em vez de "</path/to/script>".

Exemplo de exemplo de myscript.sh:

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

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

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

Como alternativa, você pode adicioná-lo ao /etc/init.d / rc.local ou fazer um arrivista trabalho se for mais baixa coisa.

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

cron resposta implementada diferente do topo votado

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

Quando faz cron corre?

Nos comentários alguém perguntou & quot; quando eles correm?". Você pode dizer em syslog / journalctl:

$ journalctl -b | grep cronJan 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-02Jan 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 rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

Uma coisa a notar é cron pode enviar por e-mail o status dos trabalhos executados e @reboot os trabalhos são executados tão cedo network manager e E-mail não será executado a menos que você colocar um sleep comando em seu(s) script (s).

Onde colocar seus scripts

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

$ ll /etc/cron.dtotal 44drwxr-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 configurei para executar cada inicialização:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/shPATH=/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-vmlinuzSHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin@reboot   root    touch "/boot/vmlinuz-"`uname -r`

Você deve usar arrivista por isso. Upstart é usado para processos Ubuntu que são iniciados automaticamente. É uma solução aprimorada como o antigo System-V init.d scripts. Ele 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.)

Se você quiser que seu script seja executado antes do systemd logo após o início do kernel, AFAIK The way está adicionando init=/path/to/script para a linha de comando do kernel em /boot/grub/grub.cfg ou mais provas futuras faça sua própria entrada de menu em /etc/grub.d/40_custom copiando uma entrada de menu de /boot/grub/grub.cfg e fazer as alterações necessárias (e em execução update-grub depois disso para grub para adicionar seu arquivo personalizado a /boot/grub/grub.cfg).

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash 

alterar

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash init=/path/to/script

Tome cuidado para colocar corretamente, por exemplo. #!/bin/bash na primeira linha e exec /sbin/init (se /sbin/init existe no seu sistema-no meu aponta para systemd) no final para evitar o pânico do kernel.

Se alguém também pudesse mostrar quando e onde isso seria incrível. Eu digo isso porque sei que existem pelo menos 2 maneiras de iniciar um script que será disparado antes que outros aplicativos sejam iniciados (como X11)

+1 para @GabrielFair. Uma grande parte do problema é que a pergunta e a resposta originais têm dez anos. Eu também acrescentaria que existem muitas maneiras de resolver esse problema. O que aconteceu com a simplicidade da filosofia Unix?! Solicite a alguém* experiente * e com pontos suficientes reescreva esta postagem ou adicione uma resposta nova, atualizada e definitiva para as versões modernas do sistema operacional.

Todo esse tópico de resposta é uma bagunça. O formato do Stack Exchange não parece ser o mais adequado para esta pergunta