如果我通过终端(以 root 身份)或 /etc/init.d(或 /etc/rc.local)运行程序,为什么会得到两个不同的结果

如果我通过终端(以 root 身份)或 /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

我有一个 C 代码(比如说my_C_program),它调用一个板特定的二进制文件(通过system("spictl someparameters"))调用spictl以使用 SPI 接口

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

执行spictl没有问题,并从 SPI 接口输出数据。

问题:

我需要在电路板通电时运行该程序。因此,我在at/user/sbin/my_C_program之前添加了一行。当板子上电时,执行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(via system(spictl someparameters)) 并且执行没有任何问题。但如果我运行my_C_program/etc/rc.local编写/etc/init.d脚本,则spictl无法按预期工作。我怀疑这与root权限有关。当我在终端(以 root 身份)上执行程序时,一切正常。但我猜想/etc/rc.local/etc/init.d某种方式以较低的权限运行该程序。我无法真正解决以 root 身份从终端执行命令或通过脚本执行程序之间的/etc/rc.local区别/etc/init.d/。如果您也认为这是权限问题,请您解释一下如何确保init.d脚本或rc.local以最高权限运行程序。或者可能是什么问题?

请注意,该问题与 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

相关内容