Por que o rc.local requer caminhos absolutos? Como posso executar um script na inicialização que não os use?

4

Eu tenho um script que é executado na inicialização do rc.local no CentOS. Este script contém um comando para compilar meu projeto erlang usando um comando de compilação de terceiros chamado rebar. A linha do vergalhão não compila meu projeto na inicialização, mas se eu o executar manualmente, o projeto é compilado corretamente. Eu presumo que isso seja porque o comando rebar chama outros comandos sem caminhos absolutos.

Como posso executar um comando na inicialização, mas em um contexto que não requer caminhos absolutos?

Eu não quero ter que consertar este comando de terceiros (e lidar com a inevitável burocracia que atende a essa bagunça) e / ou manter meu próprio fork paralelo do projeto apenas para manter esse recurso extra.

Também estou curioso para saber por que não posso usar o Google. Parece que ele deve surgir com tanta frequência que as pessoas desejam usar um comando em rc.local que não usa todas as chamadas de comando de caminho absoluto. Além disso, eu sinto que a resposta deve ser trivial, já que eu posso fazer o login imediatamente após a inicialização e executar qualquer comando que eu goste, como root, que é o usuário que o rc.local também executa! Não há um gancho onde você pode executar um script no contexto de "sim, nós realmente somos inicializados todo o caminho agora, vamos executar este script como um usuário totalmente par no sistema sem quaisquer limitações arbitrárias"?

Esta não é a primeira vez que me deparo com este problema e gostaria de entender o que está acontecendo.

EDITAR:

(Eu não vou esperar 8 horas para responder minha pergunta, então ...)

Bem, parece que a configuração do PATH funciona. Acho que tive a impressão de que os comandos em rc.local e seus filhos não são procurados no PATH, mesmo depois de chamar um script, mas isso é errado. (@TiZon me deu uma boa pista.) O motivo de ter essa impressão é porque cada resultado do Google disse ao questionador para usar caminhos absolutos em chamadas de comando, mesmo que isso seja complicado para qualquer coisa além de scripts ou scripts triviais que dependem de comandos de terceiros que não seguem essa regra. Em vez disso, a resposta é chamar o bash script com uma linha shebang adequada, descobrir qual é o PATH do seu ambiente normal fazendo eco durante uma sessão regular e, em seguida, definir o PATH no script bash de inicialização para o regular.

Espero que esta resposta chegue ao Google e ajude outras almas perdidas.

    
por mwt 11.05.2011 / 18:49

2 respostas

1

Tente colocar /bin/bash na frente do seu comando. Você não pode usar caminhos relativos porque não há nenhum ambiente para rastreá-los. Se você executar tudo em um bash-shell, o bash irá acompanhar essas coisas para você. O mesmo vale para crontab

    
por 11.05.2011 / 18:55
0

Tenha em mente que rc.local é executado no caminho /, não no caminho em que está localizado.
Portanto, se você chamar um script de rc.local, como /home/myscript
e se esse script contiver caminhos relativos (ou seja, ele foi escrito com a suposição de que está sendo executado em / home), ele falhará quando for executado em /. Qualquer script que você deseja executar em rc.local deve ser testado executando-o em /:% cd /
./home/myscript
Se correr bem assim, então você pode ter certeza que não há um problema com caminhos absolutos / relativos

    
por 15.01.2017 / 10:47