ターミナル(root)または/etc/init.d(または/etc/rc.local)を介してプログラムを実行すると、2つの異なる結果が表示されるのはなぜですか?

ターミナル(root)または/etc/init.d(または/etc/rc.local)を介してプログラムを実行すると、2つの異なる結果が表示されるのはなぜですか?

背景:

私は組み込みデバイスで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の前に1行追加しました。ボードの電源が投入されると 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プログラムが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 

質問

端末で実行すると、my_C_programプログラムはspictl(経由でsystem(spictl someparameters))呼び出され、問題なく実行されます。ただし、スクリプトを実行my_C_programまたは/etc/rc.local作成すると、期待どおりに機能しません。私はこれがルートアクセスに関連していると思います。端末で(rootとして)プログラムを実行すると、すべてがうまく動作します。しかし、どういうわけか、より低い権限でプログラムを実行していると思います。端末でrootとしてコマンドを実行することと、スクリプトを介してプログラムを実行することの違いは実際にはわかりません。これが権限の問題であると思われる場合は、init.dスクリプトまたはrc.localが最高の権限でプログラムを実行しているかどうかを確認する方法を説明しますか?それとも何が問題なのでしょうか?/etc/init.dspictl/etc/rc.local/etc/init.d/etc/rc.local/etc/init.d/

この問題はSPIとは何の関係もありません。

PS、「ああ、Debian Lennyは古すぎるため、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

関連情報