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).
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 :
A execução crontab -epermitirá que você edite seu cron.
Adicionando uma linha como esta a ela:
@reboot /path/to/script
executará esse script assim que o computador for inicializado.
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.
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
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).
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 '...'.
é 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:
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.
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.
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).
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:
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!
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:
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.)
Respostas:
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:
Salve isso em um
.conf
arquivo/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).fonte
system->pref->startup applications
não podem ser encontrados/etc/init/
nem em~/.config/upstart
. Então, onde os aplicativos de inicialização são definidos?Uma abordagem é adicionar uma tarefa cron do @reboot :
crontab -e
permitirá que você edite seu cron.Adicionando uma linha como esta a ela:
executará esse script assim que o computador for inicializado.
fonte
@reboot
palavra-chave é uma ótima dica, porque não é amplamente conhecida.man 5 crontab
diz que@reboot
é executado na inicialização (quando o cron daemon é iniciado).rc.local
já 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 ..Que tal adicionar o comando
/etc/rc.local
? você terá que usar o acesso sudo para editar este arquivo.fonte
chmod 755 rc.local
e adicionar#!/bin/bash
à primeira linha.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 systemdOneShot
. Por exemplo, crie/etc/systemd/system/foo.service
contendo:Então corra:
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
ExecStart
linhas: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:
man 5 systemd.service
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--user
opção adicionada: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 emsh -c '...'
oubash -c '...'
.1 Ao contrário de demônios de longa vida.
fonte
WantedBy
usado aqui, por exemplo, inicia quando omulti-user.target
alcance é alcançado. Você pode usarBefore
,After
,Requires
, etc. Vejaman systemd.unit
RemainAfterExit
Depende do serviço que você inicia e do comportamento desejado. Por exemplo,/bin/df -h
<s> teria </s> deveria terRemainAfterExit=no
.df
essas necessidadesRemainAfterExit=no
. A menos que você queira executar repetidamente o comando toda vez que executarsystemctl start foo
.Existem diferentes maneiras de executar comandos automaticamente:
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 init
eman 8 init
fornecendo todos os detalhes.Um script de shell nomeado
.gnomerc
em 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
.gnomerc
script 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.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
.gnomerc
script, exceto que você não precisa conhecer ash
sintaxe (mas também não pode usar nenhumash
construção de programação).fonte
.gnomerc
aparentemente é executado antes de carregar o Unity e,Startup Applications
aparentemente, é 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!sudo update-rc.d myscript.sh defaults
, onde /etc/init.d/myscript.sh é o seu script, também o executa na inicialização..desktop
arquivo pode ser colocado aqui, o qual será executado na inicialização.Exemplo de exemplo para o
.desktop
arquivo:Colocando o seguinte
.desktop
arquivo$HOME/.config/autostart
e fornecidochmod +x
:Aqui
"</path/to/script>"
é substituído pelo caminho para o seuscript.sh
(geralmente recomendado para
/usr/local/bin
que possa ser executado pelo comando diretamente, digamyscript
substituído por"</path/to/script>"
).Exemplo de exemplo de
script.sh
:Resultado: o
.desktop
arquivo será iniciado a partir do$HOME/.config/autostart
qual executar o scriptExec=
Portanto, você pode executar o script de shell desejado na inicialização!
fonte
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
fonte
cron
resposta implementada diferente do top votadoEssa resposta ainda usa,
cron
mas 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 usarcron
para executar trabalhos quando o computador é inicializado desde 16.04.Quando
cron
funciona?Nos comentários, alguém perguntou "quando eles correm?". Você pode dizer no syslog / journalctl:
Uma coisa a observar é
cron
que você pode enviar por e-mail o status dos trabalhos executados e os@reboot
trabalhos executados para que o gerente de rede e o email iniciais não sejam executados, a menos que você insira umsleep
comando no (s) script (s).Onde colocar seus scripts
Coloque seus scripts no diretório
/etc/cron.d
:Como é um script?
Aqui estão alguns scripts que eu configurei para executar cada inicialização:
fonte
@reboot
.crontab -e
alguns 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.crontab -e
traz à tona memórias de asteriscos ("*") por minutos, horas, etc., que eu sempre achei necessário pesquisar no google. Ainda acho o uso/etc/cron.d
e a/etc/cron.daily
minha opção. Especialmente porque espelha/etc/udev/rules.d
e/etc/systemd/system-sleep
métodos. Parece um bom ajuste.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.)
fonte