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:
- Execucao
crontab -epermitirá que você edite seu cron. -
Adicionando uma linha como esta a ele:
@reboot /path/to/scriptexecutará 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/commandSalve 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.localIsso 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 myhostObserve 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.targetExecutar:
sudo systemctl daemon-reloadsudo systemctl enable foo.serviceEssencialmente, 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 failureO 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.serviceSintaxe 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:
-
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 initeman 8 initdê-lhe os detalhes completos. -
Um script shell chamado
.gnomercem 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
.gnomercscript está terminado; portanto, se você quiser iniciar automaticamente algum programa de longa duração, você precisa anexar¶ a invocação do programa, a fim de destacá-lo do shell em execução. 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
.gnomercscript, exceto que você não precisa sabershsintaxe (mas você também não pode usar nenhumshconstruçã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 ScriptAqui "</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>exitResultado:.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 rootUma 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-threadingComo é 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/scriptTome 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