Como executar um script durante a inicialização como root

59

Eu tinha um script que ativa automaticamente meu wifi sem usar o gerenciador de rede, mas não sei como executar o script como root enquanto o sistema está inicializando. Como faço para que o script seja executado automaticamente durante a inicialização?

user128712
fonte
Os programas de inicialização automática são configurados em autostartmanifestos ou em *.servicearquivos em vários locais, assim como em init.dou crontab. Veja isto: unix.stackexchange.com/a/525845/43233
Noam Manos

Respostas:

54

Coloque o script que você deseja executar no diretório /etc/init.d e torne o script executável.

chmod 755 myscript

Uma vez feito isso, crie um link simbólico no diretório em nível de execução que você gostaria de usar, por exemplo, se você deseja executar um programa no nível de execução gráfico 2, o nível de execução padrão para o Ubuntu, coloque-o no /etc/rc2.ddiretório Você simplesmente não pode colocá-lo no diretório, você deve indicar quando ele será executado, indicando a inicialização com um "S" e a ordem de execução é importante. Coloque-o depois de todo o resto do diretório, atribuindo-lhe um número maior.

Se o último script a ser executado for rc.locale tiver esse nome S99rc.local, você precisará adicionar seu script como S99myscript.

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

Cada /etc/rc*.ddiretório compatível com versões anteriores possui links simbólicos para o /etc/init.d/diretório.

Radu Rădeanu
fonte
1
Observe que no Ubuntu Server 14.04, eu precisava usar /etc/rc2.d, em vez de rc3.dcomo indicado no exemplo. Parece que rc2.dnão é apenas o nível de execução gráfica.
24414 Brad
1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dlevará você para qual /etc/rc?.ddiretório corresponde ao seu nível de execução padrão.
Kevin
1
Em vez disso: "Se o último script a ser executado for rc.locale tiver esse nome S99rc.local, você precisará adicionar seu script como S99myscript.". Você quis dizer: "Se o último script a ser executado é myscripte é nomeado S99myscript, você precisa adicionar seu script como S99myscript."
Dor
6
Lembre-se de que isso não funcionará com o systemd (ou seja, começando com o Ubuntu 16.04). Veja isso em seu lugar.
Alexander Revo
26

Inclua o comando no /etc/rc.local. Ele será executado sempre que o nível de execução do usuário for alterado.

Nota: Você deve colocar o comando antes da última linha em /etc/rc.local que contém: "exit 0".

thefourtheye
fonte
3
Nota: você deve colocar o comando antes da última linha /etc/rc.localque contém: exit 0
rubo77
3
/etc/rc.localno ubuntu 15.10 comentou que "Este script é executado no final de cada nível de execução multiusuário". Então o script pode ser executado várias vezes durante a inicialização, certo?
27615 jarno
@jamo, sim, em cada nível de execução. Não sei como isso está relacionado à execução "na inicialização", que geralmente significa "executar uma vez na inicialização".
Erm3nda 22/05
17

Use uma crontabopção para executar seu script após a reinicialização,

você pode fazer isso adicionando @rebootcódigo no cron

Abra o crontab pelo usuário root:

$ sudo crontab -e

Adicione o próximo registro na parte inferior:

@reboot yourScriptPath 

Isso fará o que você quiser.

hs.chandra
fonte
Você quis dizer usar o comando crontab -e, que não precisa de privilégios de superusuário? Gostaria de saber se ele pode executar scripts que precisam ser executados como root.
27615 jarno
Eu testei isso. Não executa o script como raiz.
jarno 11/01
4
Você precisa adicionar a linha enquanto executa o comando sudo crontab -epara fazê-lo executar o script como root durante a inicialização.
Jarno
não se esqueça de remover /var/run/crond.reboot, se não, não vai executar a tarefa
Albert Català
Apenas para constar, tenho certeza de que o @jarno já o saberá. Cada usuário tem sua própria tarefa cron, portanto, se você a adicionar à tarefa do seu usuário (executando crontab -e sem sudo), o script será executado pelo seu usuário. Portanto, você precisa executá-lo como root para permitir a execução de scripts como root na inicialização.
eddieferetro 29/01
9

Isso funcionou para mim no Ubuntu 17.04:

  1. Crie um arquivo de script de excursão, como é disable_cdromconveniente para sua localização. No meu caso home/yterle/disable_cdrom. No meu caso:

    #!/bin/sh
    eject /dev/sr0 -i 1
  2. torná-lo executável chmod 775 disable_cdrom

  3. navegue /etc/systemd/systeme crie lá um servicearquivo. Por exemplosudo gedit /etc/systemd/system/disable_cdrom.service

Minha disable_cdrom.serviceaparência é assim:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

Onde ExecStartaponta para executar seu script/bin/sh

Em seguida, execute systemctl enable disable_cdrom.servicepara ativar o serviço systemd

YTerle
fonte
1
Votação isso porque é o que eu estava procurando, mas eu acho que você quer dizersystemctl enable disable_cdrom.service
KennetRunner
5

Inclua seu arquivo de script /etc/init.d/ com permissão de executável e defina diferentes níveis de execução

$ update-rc.d script-name default

Ele colocará seu script na inicialização da inicialização.

MS Parmar
fonte
Não funciona para mim no Kali Linux v2.0. Você quis dizer update-rc.d script-name enable?
Sopalajo de Arrierez 05/10
update-rc.d <script-name> script de shell padrão que você copiou em /etc/init.d/ <script-name>
MS Parmar 5/15
4

Crie um arquivo de texto como este em /etc/cron.d/:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

(Você deve substituir yourScriptPatho caminho para o script que deseja executar.)

jarno
fonte
1

Cuidado ao adicionar o script a rc.local- eu estava preso na tela inicial por causa disso. Pressionar Alt+ F1revelou o que estava acontecendo atrás da tela inicial (o script rc.localestava em execução).

Eu não pude sair disso.

  • Ctrl+ Alt+ Delou
  • Alt+ PrtSc+ Kou
  • Ctrl+ Alt+F#

nada funciona.

Eu tive que inicializar a partir de uma imagem USB do Ubuntu, encontrar rc.local, me dar permissões para arquivar e excluí-lo. Acho que você não deve fazer coisas se não souber o que está fazendo.

Gašper Čefarin
fonte