Por que o comando /etc/rc.local não é executado durante a inicialização?

39

Eu tenho um único comando no meu /etc/rc.localscript que deve iniciar o daemon de atualização do Tiny Tiny RSS durante a inicialização, mas o script não é executado durante a inicialização. Por quê?

O arquivo /etc/rc.local inteiro:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/sbin/start-stop-daemon -b -c www-data:www-data -S -x /usr/bin/php /var/www/ttrss/update_daemon2.php -- -quiet

exit 0

/etc/rc.local é executável:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local

/etc/init.d/rc.local existe e é executável:

# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 801 Jul 27  2012 /etc/init.d/rc.local

/etc/init.d/rc.local deve ser executado na inicialização deste nível de execução:

# runlevel 
N 2
# ls -l /etc/rc2.d/S99rc.local 
lrwxrwxrwx 1 root root 18 Sep 22  2012 /etc/rc2.d/S99rc.local -> ../init.d/rc.local

Se eu ligar manualmente para /etc/rc.local na linha de comando, o update_daemon carregará ...

# /etc/rc.local
# ps ax | grep update_daemon2.php
2233 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet
2234 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet

... o que devo lembrar de fazer sempre que meu servidor reiniciar até que esse problema seja corrigido.

Perguntas semelhantes existem, mas até agora não consegui aplicar as informações no meu problema específico.

Por que o comando no rc.local não é executado durante a inicialização?

xx
fonte
Pode ser devido à requirettyconfiguração. Quando você está conectado, está executando o script em TTY, mas durante a inicialização do sistema, ele não está em TTY. Este link pode ajudá-lo a shell-tips.com/2014/09/08/… Obrigado.
KICT 24/10

Respostas:

23

rc.localO script é encerrado se ocorrer algum erro ao executar qualquer um de seus comandos (mencione o -esinalizador em #!/bin/sh -e).

É possível que alguns pré-requisitos não sejam atendidos quando você tenta executar seus comandos quando a rc.localexecução ocorre, portanto, sua execução falha.

Encontrei a mesma coisa ao configurar manualmente o governador da CPU e não o fiz rc.local. Aqui está minha solução alternativa personalizada, usada update-rc.dpara executar seus comandos na inicialização:

  1. Crie um arquivo myscript.shno diretório /etc/init.dcom um cabeçalho:#!/bin/sh
  2. Coloque seus comandos personalizados como o conteúdo
  3. Torne executável: sudo chmod +x /etc/init.d/myscript.sh
  4. Crie links simbólicos para o seu script para vários níveis de execução: sudo update-rc.d myscript.sh defaults

Além disso, você pode verificar os /etc/network/if-up.dscripts e verificar se é possível acionar seus comandos quando a rede iniciar.

Desenhou
fonte
Obrigado pela resposta. Minha configuração mudou desde que publiquei a pergunta, por isso não consigo testar se sua resposta teria resolvido o problema.
xx
Por favor, diga-me o que o passo 4 faz? Eu sou novo emupdate-rc.d
Mohith7548 5/11
7

Eu tive algum problema semelhante no rc.local não executando na inicialização

sshades me forneceu a seguinte resposta:

O Ubuntu agora está usando o systemd e o rc.local agora é considerado um serviço que está desativado "por padrão". Você pode ativar o rc.local digitando o seguinte comando e reiniciando:

sudo systemctl enable rc-local.service

https://askubuntu.com/a/770033/395498

Embora eu não testei sua solução, acho que parece lógico e funcionará. Contudo :

Eu também encontrei uma solução que adicionar um script a ./.config/autostart-scripts/ fará o truque

Diet Bos
fonte
7
Obtendo este erro. Os arquivos da unidade não possuem configuração de instalação (configurações WantedBy, RequiredBy, Also, Alias ​​na seção [Install] e DefaultInstance para unidades de modelo). Isso significa que eles não devem ser ativados usando systemctl. Os possíveis motivos para ter esse tipo de unidades são: 1) Uma unidade pode ser habilitada estaticamente ao ser vinculada por um link do diretório .wants / ou .requires /. 2) O objetivo de uma unidade pode ser atuar como auxiliar de alguma outra unidade que tenha uma dependência de requisitos.
Rıfat Erdem Sahin
Também estou recebendo esse erro. Se rc.localestiver desligado, qual é a alternativa?
Ben
5

tente sudo sysv-rc-confverificar se rc.localestá ativado

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]
zuba
fonte
Sim, está ativado.
xx
esse comando precisa ser instalado?
Jcollum
11
@ jcollum sim, é um programa de um pacote com o mesmo nome. Para instalar, digitesudo apt install sysv-rc-conf
banan3'14
rc.localnem está na minha lista de serviços!
Ben
5

Verifique se o script rc.local é executável:

sudo chmod +x /etc/rc.local

Em seguida, habilite-o:

sudo systemctl enable rc-local.service

Reinicie o sistema ou inicie o script manualmente executando:

sudo systemctl start  rc-local.service

O status do serviço pode ser exibido executando:

$ sudo systemctl status rc-local.service
 rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) 
Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2018-04-02 10:39:44 -03; 1s ago
  Process: 2044 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 2049 (svscanboot)
Tasks: 3
 Memory: 556.0K
CPU: 10ms
CGroup: /system.slice/rc-local.service
leobocao
fonte
Você não precisa habilitar manualmente o serviço. Se o arquivo existir e for executável, o systemd ativará automaticamente o rc-localserviço.
Muni
4

Tivemos esse problema em alguns servidores hospedados carregando regras de FW.

Nestas caixas, eles são reiniciados MUITO rapidamente e descobrimos que basta colocar um "sleep 1" em rc.local antes que as instruções de carregamento pareçam corrigir o problema. Eu acho que deu um pouco de tempo para as interfaces se estabelecerem antes de carregar as regras do FW.

Simon Hart
fonte
11
Obrigado. sleep 1resolveu meu problema. Interessante eu tenho muitos servidores, mas apenas um tem esse problema.
Qian Chen
1

Uma vez editei rc.localcom o Bloco de notas no Windows e ele começou a ter esse problema.

Nesse caso, o uso de um editor de texto suporta a conversão de EOL, como o Notepad ++, para converter o estilo de EOL em 'Unix', pode resolvê-lo.

Você também pode fazer isso :set ff=unixno Vim.

SyaSyaNown
fonte
1

Eu encontrei nos contêineres Ubuntu lxc que, se o rc.local tiver um shebang perfeitamente correto, por exemplo

#!/bin/sh

falha, mas se você remover o shebang, ele funcionará.

Não cheguei ao fundo do porquê ou qual shell ele usa, eu acho que ele também bombardeia primeiro diferente de zero. (Em outras instalações do Ubuntu, o shebang adequado não é um problema)

teknopaul
fonte
0

Você precisará verificar se /etc/rc.localé executado durante a inicialização do servidor com o comando:

sudo systemctl enable rc-local.service

William
fonte