Não é possível fazer com que o rc.local seja executado automaticamente

Não é possível fazer com que o rc.local seja executado automaticamente

então, tenho tentado fazer o /etc/rc.localscript funcionar e, na minha vida, nada parece funcionar. Posso executá-lo manualmente usando service rc.local start, e ele apenas ecoa 'hi' em um arquivo em meu diretório inicial, mas na reinicialização ele 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ão as informações relevantes:

# 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 ambos /etc/rc.localand /etc/init.d/rc.local, running update-rc.d rc.local remove, depois restaurá-los e executar update-rc.d rc.local defaultscomo nesta pergunta:Rc.local não executa. Isso não funcionou.

Também não funciona após reiniciar ou entrar em qualquer nível de inicialização. Não funcionou quando a linha shebang era lida #! /bin/sh -eou #! /bin/bash. Se eu executá-lo manualmente, posso fazer com que os /etc/rc.localscripts /etc/init.d/rc.locale ecoem em arquivos diferentes.

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

Aqui estão algumas informações adicionais sobre o que vale a pena:

# 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

Responder1

O problema é que nesta linha:

echo hi > ~user/test

~usernão está se expandindo conforme o esperado. rc.localestá em execução, mas devido à expansão inesperada, ele está tentando gravar em algum lugar para o qual provavelmente não tem permissão.

Em vez disso, tente o seguinte:

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

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

Porém, minha recomendação seria usar caminhos explícitos, em vez de depender do ambiente externo.

Responder2

"Não me importo de ouvir sobre alternativas (como o iniciante)" implica que você não entende algumas coisas. Não sou um usuário do Mint, mas aparentemente é um sistema baseado em iniciante. Upstart é um daemon init e seu sistema possui apenas um instalado. Portanto, o iniciante 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 usar alguns dos comandos antigos como servicee talvez update-rc.d.

Como você mesmo admite que não tem muita noção de como funciona o sistema sysvinit, acho que é uma perda de tempo aprender. Você também pode aprender como funciona o seu daemon init real. O Upstart é bastante simples; tenha em mente que 95% das reclamações sobre isso (e as preocupações paralelas sobre o systemd em sistemas derivados do fedora) são apenas pessoas que têm uma compreensão simples do sysvinit e estão furiosas porque podem ter que gastar algumas horas aprendendo algo novo.

Então, eu diria para verificar os diretórios rc, etc, em busca de links no estilo sysvinit, mas pela aparência da pergunta "Rc.local não executa" que você vinculou a cuja solução você diz ter falhado, 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.

O Upstart processa .confarquivos em /etc/init(nota: não em init.d). Portanto, se você tiver algum script que deseja executar na inicialização, basta adicionar um arquivo .conf ao /etc/init. Não precisa ser executável, mas deve pertencer ao 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 mais travessuras do sysvinit, recomendo que você altere 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 as tags scripte end scripté processado pela casca).

A referência definitiva para o iniciante é provavelmenteo livro de receitas iniciante. Como eu disse, é uma melhoria, em termos de facilidade de uso, do sysvinit, mas infelizmente ainda há uma escassez de material decente sobre isso online, e muitas coisas confusas e incompletas. Mas executar um script na inicialização é tão simples quanto descrito.

Se o arquivo .conf for denominado "my-localboot.conf", você poderá testar seu serviço com

initctl start my-localboot

informação relacionada