Não é possível obter o rc.local para ser executado automaticamente

1

Por isso, tentei executar o script /etc/rc.local e, aparentemente, nada parece funcionar. Eu posso executá-lo manualmente usando service rc.local start , e apenas echos 'oi' para um arquivo no meu diretório home, mas na reinicialização não é executado. Todas as permissões corretas parecem estar definidas e existem links nos diretórios rc # .d corretos. Para referência, aqui está a informação relevante:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 45 Apr 12 21:10 /etc/rc.local


# ls -l /etc/init.d/rc.local                                  
-rwxr-xr-x 1 root root 812 Apr 12 21:00 /etc/init.d/rc.local


# for i in {0..6}; do cd rc$i.d ; pwd; ls -l |grep rc.local; cd ..; done
/etc/rc0.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc1.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc2.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc3.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc4.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc5.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc6.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local


# cat /etc/rc.local
#! /bin/bash

echo hi > ~user/test

exit 0

Eu tentei excluir os /etc/rc.local e /etc/init.d/rc.local , executando update-rc.d rc.local remove , restaurando-os e executando update-rc.d rc.local defaults , como nesta pergunta: O Rc.local não é executado . Isso não funcionou.

Ele também não funciona depois de reinicializar ou entrar em qualquer nível de inicialização. Não funcionou quando a linha shebang leu #! /bin/sh -e ou #! /bin/bash . Se eu executar manualmente, posso obter os scripts /etc/rc.local e /etc/init.d/rc.local para fazer o mesmo em arquivos diferentes.

Então, minha pergunta é ... o que estou fazendo de errado e como posso fazer com que o rc.local seja executado? Além disso, embora eu não me importe em ouvir sobre alternativas (como upstart), eu só aceitarei uma resposta que me mostre (ou me ajude a achar) como fazer com que o rc.local funcione normalmente (e idealmente me diga o que deu errado).

Veja algumas informações adicionais sobre o que vale:

# dmesg | grep "Linux version"
[    0.000000] Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 (Ubuntu 3.5.0-17.28-generic 3.5.5)


# cat /proc/version
Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012

# lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 14 Nadia
Release:        14
Codename:       nadia
    
por atomictom 13.04.2013 / 06:02

2 respostas

0

O problema é que nesta linha:

echo hi > ~user/test

~user não está expandindo conforme o esperado. rc.local está sendo executado, mas devido à expansão inesperada, ele está tentando gravar em algum lugar para o qual provavelmente não tem permissão.

Tente o seguinte:

echo ~user/test > /dev/shm/test

Em seguida, verifique o conteúdo de /dev/shm/test . Isso mostrará que rc.local é executado e o que está expandindo ~user para.

Embora, minha recomendação seja usar caminhos explícitos, em vez de confiar no ambiente externo.

    
por 16.04.2013 / 20:39
0

"Eu não me importo de ouvir sobre alternativas (como upstart)" implica que você não entende um par de coisas. Eu não sou um usuário de hortelã, mas aparentemente é um sistema baseado em upstart. O Upstart é um daemon de inicialização e seu sistema tem apenas um instalado. Portanto, o novato não é uma alternativa; não há alternativas - seu sistema usa upstart . Período. Não usa mais nada. No entanto, o upstart inclui compatibilidade retroativa com scripts sysvinit, o que significa que você pode gerenciar serviços colocando links em diretórios / etc / rc e usando alguns dos comandos antigos como service e talvez update-rc.d .

Como você não admite que sabe muito bem como o sistema sysvinit funciona, acho que é uma perda de tempo para você aprender. Você também pode aprender como o seu daemon de inicialização real funciona. O Upstart é bem direto; Tenha em mente que 95% das queixas relacionadas a ele (e apertos paralelos sobre systemd em sistemas derivados do fedora) são apenas pessoas que têm uma compreensão simples do sysvinit e estão loucas por terem que passar algumas horas aprendendo algo novo.

Então, eu diria para verificar os diretórios rc, etc, para os links do estilo sysvinit, mas a partir da aparência da pergunta "Rc.local não é executada" vinculada a cuja solução você diz que falhou, acho que você está perdendo seu tempo com isso neste momento. Esqueça a compatibilidade do sysvinit e os diretórios / etc / rc e init.d.

Upstart processa .conf arquivos em /etc/init (nota: não init.d). Então, se você tem algum script que você quer executar na inicialização, basta adicionar um arquivo .conf em / etc / init. Ele não precisa ser executável, mas deve ser de propriedade do root.

author "You"

start on started local-filesystems

script
    /etc/rc.local # but don't really be this lazy, see below
end script

Para evitar confusões futuras e outras manobras do sysvinit, eu recomendo que você mude o nome do script /etc/rc.local para outra coisa, ou melhor ainda, apenas mova o que estiver nele para o arquivo .conf (tudo entre o script e end script tags são processadas pelo shell).

A referência definitiva para o newstart é provavelmente o livro de receitas inicial . Como eu disse, é uma melhoria, facilidade de uso sábio, de sysvinit, mas infelizmente ainda há uma escassez de material decente sobre isso on-line e um monte de coisas confusas e incompletas. Mas rodar um script na inicialização é tão simples quanto o descrito.

Se o arquivo .conf é chamado de "my-localboot.conf", você pode testar seu serviço com

initctl start my-localboot
    
por 13.04.2013 / 11:37