터미널(루트로) 또는 /etc/init.d(또는 /etc/rc.local)를 통해 프로그램을 실행하면 두 가지 다른 결과가 나타나는 이유는 무엇입니까?

터미널(루트로) 또는 /etc/init.d(또는 /etc/rc.local)를 통해 프로그램을 실행하면 두 가지 다른 결과가 나타나는 이유는 무엇입니까?

배경:

나는 임베디드 장치에서 Debian Lenny를 사용하고 있습니다.

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

my_C_program보드별 바이너리를 호출하는 C 코드(예: SPI 인터페이스 호출 system("spictl someparameters")) 가 있습니다.spictl

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

my_C_program명령줄에서 코드를 실행하는 경우 ( )

user:~# /user/sbin/my_C_program

문제 없이 실행되며 spictlSPI 인터페이스에서 데이터를 출력합니다.

질문:

보드의 전원이 켜진 상태에서 프로그램을 실행해야 합니다. 그래서 /user/sbin/my_C_programat 앞에 한 줄을 추가했습니다. 보드의 전원이 켜지면 my_C_program이 실행되고 완료되지만 SPI 인터페이스는 데이터를 출력하지 않습니다.exit 0/etc/rc.localspictl

/etc/init.d/스크립트를 통해 프로그램을 실행 하려고 합니다.이 링크. 스크립트가 제대로 작동하고 실행되고 my_C_program, 프로그램이 spictl성공적으로 실행되지만( system()반환 값에 표시된 대로) SPI 인터페이스는 데이터를 출력하지 않습니다!

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

top프로그램이 루트로 실행 중임을 나타냅니다.

  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 

질문

터미널에서 실행하면 my_C_program프로그램이 spictl(를 통해 system(spictl someparameters)) 호출되어 문제 없이 실행됩니다. 하지만 스크립트를 실행 my_C_program하거나 /etc/rc.local작성 하면 예상대로 작동하지 않습니다. 나는 이것이 루트 액세스와 관련이 있다고 생각합니다. 터미널에서 (루트로) 프로그램을 실행하면 모든 것이 잘 작동합니다. 하지만 어떻게든 더 낮은 권한으로 프로그램을 실행하는 것 같아요 . 터미널에서 루트로 명령을 실행하는 것과 스크립트를 통해 프로그램을 실행하는 것의 차이점을 실제로 알 수는 없습니다 . 이것이 권한 문제라고 생각된다면 init.d 스크립트 또는 rc.local이 가장 높은 권한으로 프로그램을 실행하는지 확인하는 방법을 설명해 주시겠습니까? 아니면 무엇이 문제일까요?/etc/init.dspictl/etc/rc.local/etc/init.d/etc/rc.local/etc/init.d/

이 문제는 SPI와는 아무런 관련이 없습니다.

PS, "아, 데비안 레니는 너무 늙었으니 wheezy 등을 사용해야 합니다" 같은 불필요한 대화를 피하기 위해 이 보드에는 armv4l 프로세서가 있으며 제작자의 말대로 일부 프로세서 지침으로 인해 wheezy를 지원하지 않습니다.

답변1

C 실행 파일을 실행하려면 먼저 일부 환경 변수를 설정해야 할 수도 있습니다. 환경과 같은. 변수 $PATH또는 사용자가 로그인할 때까지 설정되지 않는 변수 $LD_LIBRARY_PATH등의 다른 변수가 있습니다 .$HOME

예를 들어, 애플리케이션이 구성 파일 및/또는 로그 파일에 액세스하려면 마지막 항목이 필요할 수 있습니다.

답변2

무슨 일이 일어나고 있는지 조사하려면 프로그램의 출력(특히 오류)을 파일로 리디렉션하세요.

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

아무런 단서도 나오지 않는다면, 대포를 열어보세요: 설치스트레스.

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

명령줄에서 프로그램을 실행하고 추적 결과를 비교할 수도 있습니다. 대부분의 행이 수행하는 작업을 이해하지 못하더라도 다른 추적이 있는 처음 몇 행은 단서를 제공해야 합니다. 일반적으로 로드 주소가 다르기 때문에 정수 값만 관련된 대부분의 차이점을 무시하고 시스템 호출의 차이점에 중점을 둡니다.

대부분의 경우 프로그램이 특정 파일을 찾고 있지만 해당 파일이 다른 디렉토리에서 호출되었거나 PATH다른 환경 변수가 프로그램 시작 시 예상한 값으로 설정되지 않았기 때문에 파일을 찾을 수 없습니다 /etc/rc.local.

관련 정보