LINUX.ORG.RU

Чем запуск через cron отличается от запуска руками?

 , crapdev,


0

1

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

$./modemdaemon >> status/daemon.log
делаю, то усё окей^
[01.04.13 23:47:31] Last IP: 20.20.20.20. Current IP: 21.21.21.21. Gateway: 8.8.8.8                                                                       
        [01.04.13 21:47:36] Remote server saved your IP!

/* first line == printf("%s Last IP: %s ...", ...);
second line == [curl]->[remote host] == <?php echo... ?> */
НО!
*/10 * * * * /server/modemdaemon >> /server/http/status/daemon.log 2>&1
Мне показывает чуть иначе:
	[01.04.13 19:10:04] Remote server saved your IP!
[01.04.13 21:10:01] Last IP: 21.21.21.21. Current IP: 22.22.22.22. Gateway: 8.8.8.8
Внутри демона(там тупо printf()-ов натыкано) ничего сложного - system(«curl -s -d 'abra=cadabra&syaski=masyaski' http://remote.host"); да пара if-ов чтобы раз в час в лог писался текущий IP, при смене IP писался предыдущий и текущий и шлюз, а также curlился PHPsharedhostingDIYdyndns скрипт, а если шлюз провайдера завис в 0.0.0.0, то рестарт модема. Вот. Спасибо если не откажетесь объяснить, чем же запуск в cron отличается от мануального запуска

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

запуск в cron отличается от мануального запуска

Хм, кроме переменных окружения ничего не могу вспомнить, предлагаю проверить скрипт, предварительно установив лишь: USER, LOGNAME, HOME, and SHELL. (или что ваш крон ставит)

anonymous
()
Ответ на: комментарий от anonymous

Честно говоря, не понял что ты предлагаешь... Представь, что внутри main две функции - одна печатает в stdout строку, а вторая вызывает system() в которой curl записан. Руками он работает верно - сначала печатает строку, а затем ответ сервера. В кроне сначала идет ответ хоста, а лишь потом печать строки. Вот не знаю как с кроном дружить - там инопланетный ман.

minakov ★★★★★
() автор топика
Ответ на: комментарий от minakov

Если там всего две строки, дак покажите здесь исходник целиком, если строк больше, то сделайте исходик из двух строк с подобным поведением и покажите его здесь.

Надеюсь, перед вызовом system() вы делаете fflush()?

mky ★★★★★
()
Ответ на: комментарий от minakov

Представь, что внутри main две функции - одна печатает в stdout строку, а вторая вызывает system() в которой curl записан. Руками он работает верно - сначала печатает строку, а затем ответ сервера

навскидку отличия - в первом случае stdout (и stderr кстате) - терминал, то есть isatty :: true; во втором случае - нет.

про fflush уже сказали ранее

MKuznetsov ★★★★★
()

Про flush уже сказали, на isatty намекнули.

FILE работает в трех режимах буферизации.

Default Buffering modes:

  • stdin is always buffered
  • stderr is always unbuffered
  • if stdout is a terminal then buffering is automatically set to line buffered, else it is set to buffered
$ cat bug.c
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    printf ("first\n");
    system ("echo second");
    return EXIT_SUCCESS;
}
$ gcc -Wall bug.c -o bug

$ ./bug
first
second

$ ./bug >a
$ cat a
second
first

$ stdbuf -oL ./bug > b
$ cat b
first
second

Правильно делать fflush (NULL) перед system, fork, etc. А можно по быстрому заткнуть:

*/10 * * * * stdbuf -oL /server/modemdaemon >> /server/http/status/daemon.log 2>&1

fopen ★★
()
Ответ на: комментарий от fopen

Спасибо добрый человек! если бы так всегда подсказывали, был бы рай на земле

minakov ★★★★★
() автор топика

Спасибо всем советчикам! Действительно, все дело в буфере, и fflush() в данном случае помог.

minakov ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.