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 -e
permitirá que você edite seu cron. -
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 johndoe
s ~/.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:
-
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
eman 8 init
dê-lhe os detalhes completos. -
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. 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 sabersh
sintaxe (mas você também não pode usar nenhumsh
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.sh
Se 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