2012-05-29 48 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