2012-05-29 51 views
1

我已经在运行Angstrom Linux的嵌入式系统(Devkit8000,它是众所周知的BeagleBoard的克隆版)的c中编写了一个程序。由crontab执行的程序问题

该程序创建了几个线程,其中的一个线程负责使用连接到该板的摄像头拍摄图片,现在第二个线程仅将该图像移动到另一个路径。程序应该在一整天内运行,停止它的唯一方法是发送一个信号。

我编辑了crontab以在特定小时内启动程序并在必须停止时发送信号,问题是以这种方式启动程序导致进程在一段时间运行后被终止,但是,如果我手动启动程序(通过命令行),它完美地工作,不会停止。

我不知道crontab和命令行之间的这种不同行为的原因。我检查了系统日志,但没有发现任何有用的东西。我也一直在读一点,发现操作系统可以杀死一个进程,如果它使用这么多的资源,但没有意义,这只发生在只有一种情况(crontab vs手动)...

任何线索关于发生了什么?

预先感谢您!

+1

与命令行相比,从crontab运行某些内容时,环境变量通常不会相同。确保在启动应用程序之前设置所有相关的'PATH'变量。还要确保应用程序库中可能使用的任何环境变量都具有预期值。 – HonkyTonk

+0

正如我所说的cdarke,我会看看我的代码,以检查它是否使用任何$ ENV变量:) – Kitinz

回答

0

主要区别在于通过cron运行作业会调用非交互式非登录shell。这个效果取决于用户的默认shell。例如,如果您使用Korn shell或Bash,那么您的.profile将不会被执行,就像在交互式登录shell中一样。 Korn shell 88将执行.kshrc($ ENV文件),但ksh93不会。 所以,一个良好的开始可能是由一个脚本中调用程序,在第一次“采购” .profile文件:

. $HOME/.profile 

做不到这一点......如果你说的那个过程是“封杀”,做你会得到这样的信息?如果是这样,那么这听起来像是发送SIGKILL的人,即kill -9。如果没有,那么也许你可以运行strace或ltrace来找出它在哪一点死亡。

+0

据我所知,该程序不使用任何$ ENV变量,这就是为什么这是一个非常奇怪的行为。无论如何,我会再次检查代码以确保。 关于“杀戮”的问题......我没有得到这个消息在任何地方(甚至不在系统日志中),我不认为其他用户正在发送SIGKILL,因为没有其他人可以访问此板。我只有这样的感觉,因为内存使用,操作系统是一个杀死我的过程,所以我会尝试再次检查strace和ltrace,因为你建议。 – Kitinz

+0

ENV由shell使用,而不是由程序使用。它给出(通常).kshrc文件的名称。 – cdarke