2012-05-29 2 views
1

Я закодировал программу в c для встроенной системы (Devkit8000, которая является клоном известного BeagleBoard) под управлением Angstrom Linux.Проблема с программой, выполненной crontab

Программа создает пару потоков, из них отвечает за съемку с помощью камеры, подключенной к плате, и прямо сейчас вторая нить только перемещает изображения на другой путь. Программа должна работать в течение всего дня, и единственный способ ее остановить - отправить сигнал.

Я отредактировал crontab, чтобы запустить программу за определенный час и отправить сигнал, когда он должен остановиться, проблема в том, что запуск программы таким образом заставляет процесс быть убитым через некоторое время, но, если я запускаю программу вручную (через командную строку), она отлично работает и не останавливается.

Я понятия не имею о причине этого различного поведения между crontab и командной строкой. Я проверил системные журналы, но не нашел ничего полезного. Я также немного читал и обнаружил, что ОС может убить процесс, если он использует столько ресурсов, но не имеет смысла, что это происходит только в 1 сценарии (crontab vs вручную) ...

Любой ключ о том, что происходит?

Спасибо заранее!

+1

Переменные среды, как правило, не совпадают при запуске чего-либо из crontab по сравнению с командной строкой. Перед запуском приложения убедитесь, что все соответствующие переменные «PATH» установлены. Также убедитесь, что любые переменные среды, которые могут быть использованы библиотеками в вашем приложении, имеют ожидаемое значение. – HonkyTonk

+0

Как я сказал cdarke, я посмотрю в своем коде, чтобы проверить, не использует ли он какую-либо переменную $ ENV :) – Kitinz

ответ

0

Главное отличие заключается в том, что выполнение задания через cron вызывает неинтерактивную оболочку без входа. Эффект от этого зависит от оболочки по умолчанию для вашего пользователя. Например, если вы используете оболочку Korn или Bash, тогда ваш .profile не будет выполнен, как это было бы в интерактивной оболочке входа. Korn shell 88 выполнит файл .kshrc (файл $ ENV), но ksh93 не будет. Таким образом, хороший старт может быть для вызова программы из сценария, после первого «источников» ваш файл .profile:

. $HOME/.profile 

В противном случае ... Когда вы говорите, что процесс «убит», сделать вы получаете такое сообщение? Если это так, то это звучит как кто-то, отправляющий SIGKILL, т. Е. kill -9. Если нет, то, возможно, вы можете запустить strace или ltrace, чтобы узнать, в какой момент он умирает.

+0

Насколько я знаю, программа не использует переменную $ ENV, вот почему действительно странное поведение. Во всяком случае, я проверю код еще раз, чтобы быть уверенным. О проблеме «убийства» ... Я не получаю это сообщение нигде (даже в системных журналах), и я не думаю, что другой пользователь отправляет SIGKILL, потому что никто другой не имеет доступа к этой плате. У меня только ощущение, что из-за использования памяти, ОС - это тот, кто убивает мой процесс, поэтому я попробую снова проверить с strace и ltrace, как и предложил. – Kitinz

+0

ENV используется оболочкой, а не программой. Он дает имя файла (обычно) .kshrc. – cdarke

Смежные вопросы