por que tenho dois resultados diferentes se eu executar um programa através de terminal (como root) ou /etc/init.d(or /etc/rc.local)

4

Histórico:

Eu uso o Debian Lenny em um dispositivo embutido

uname -a
Linux device 3.4.0 #83 Sun May 26 17:07:14 CEST 2013 armv4l GNU/Linux

Eu tenho um código C (digamos my_C_program ) que chama um arquivo binário específico da placa (via system("spictl someparameters") ) chamado spictl para usar a interface SPI

user:~# ls -al /usr/local/bin/spictl
lrwxrwxrwx  1 root staff      24 Jun  9  2011 spiflashctl -> /initrd/sbin/spiflashctl

se eu executar meu código ( my_C_program ) na linha de comando

user:~# /user/sbin/my_C_program

o spictl é executado sem problemas e gera dados da interface SPI.

Problema:

Eu preciso que o programa seja executado quando a placa estiver ligada. Portanto, adiciono /user/sbin/my_C_program linha antes do exit 0 at /etc/rc.local . Quando a placa é energizada, o my_C_program é executado e spictl é executado, mas a interface SPI não produz nenhum dado.

Eu tentei executar o programa via script /etc/init.d/ em este link . O script funciona bem e executa o my_C_program , o programa executa o spictl com sucesso (como diz o valor de retorno system() ), mas a interface SPI não produz nenhum dado!

ls -l /usr/sbin/my_C_program
-rwxrwxrwx 1 root root 61713 Jun 28  2013 /usr/sbin/my_C_program

top mostra que o programa é executado como root

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                          
 1095 root      20   0  2524 1140  924 R  4.2  1.8   0:00.35 top                                                                              
 1033 root      RT   0 35092  34m 1852 S  3.0 56.5   0:14.06 node 

Pergunta

se eu executar o terminal my_C_program on, o programa chama o spictl (via system(spictl someparameters) ) e ele é executado sem nenhum problema. Mas se eu executar o script my_C_program a /etc/rc.local ou /etc/init.d , então spictl não funcionará como deveria ser. Eu suspeito que isso tenha algo a ver com o privilégio de root. Quando executo o programa no terminal (como root) tudo funciona bem. Mas eu acho que /etc/rc.local e /etc/init.d de alguma forma executa o programa com um privilégio menor. Eu não consegui realmente resolver a diferença entre executar um comando do terminal como root ou executar o programa via script /etc/rc.local ou /etc/init.d/ . Se você também acha que é um problema de privilégio, poderia explicar como posso garantir que o script init.d ou rc.local executaria o programa com o maior privilégio. Ou qual poderia ser o problema?

Por favor, note que o problema / questão não é relacionado ao SPI.

P.S. para não ter conversas desnecessárias como "oh Debian lenny é muito antigo, você deveria usar wheezy etc.", o fórum tem processador armv4l e como o produtor diz que não suporta wheezy por causa de algumas instruções do processador.

    
por Angs 24.07.2013 / 16:19

2 respostas

2

Você é executável C provavelmente requer que algumas variáveis de ambiente sejam configuradas para funcionar. Por exemplo, o env. variável $PATH ou $LD_LIBRARY_PATH . Há também outras variáveis, como $HOME , que não serão definidas até que um usuário tenha efetuado login.

Este último pode ser necessário para o seu aplicativo acessar arquivos de configuração e / ou arquivos de log, por exemplo.

    
por 24.07.2013 / 16:33
1

Para investigar o que está acontecendo, redirecione a saída do seu programa (especialmente os erros) para um arquivo.

/usr/sbin/my_C_program >/root/my_C_program.out 2.>&1

Se isso não der uma pista, solte a artilharia: instale o strace .

strace /usr/sbin/my_C_program -o /root/my_C_program.from_etc_local.strace

Execute também o programa na linha de comando e compare os traços. Mesmo que você não entenda o que a maioria das linhas está fazendo, as primeiras linhas em que os traços diferem devem dar uma pista. Ignore a maioria das diferenças que só dizem respeito a valores inteiros, pois estes são tipicamente devidos a diferentes endereços de carga e foco em onde as chamadas do sistema diferem.

O mais provável é que o programa esteja procurando algum arquivo que não encontre porque foi chamado a partir de um diretório diferente ou porque PATH ou alguma outra variável de ambiente não está definida com o valor esperado quando você inicia o programa de /etc/rc.local .

    
por 25.07.2013 / 03:32