Comment to task #5647 in hc-cron: hc-cron czasami odpala dwukrotnie
zadania
Flyspray - The bug killer!
btsadmin at pld-linux.org
Fri May 27 14:47:15 CEST 2005
Project: PLD 2.x (Ac)
Package: hc-cron
Summary: hc-cron czasami odpala dwukrotnie zadania
Commented by: Marcin Kaminski (maxiu)
Comment: Z analizy kodu hc-crona w wesji stable, development oraz z
vixie-cron wynika że wszystkie opierają się w czekaniu na tym samym
kodzie. Kodzie wg mnie nieprawidłowym, bo sleep() zaokrągla czas i
może podać w wyniku mniejszy czas niż faktyczny, a te crony
zakładają że poda czas równy lub większy. Wystarczy że chociaż
raz zadanie skończy się w drugiej połowie sekundy sleepa i sleep
zostanie przerwany sygnałem, i przy najbliższym obudzeniu crona
wykona on zadania podwójnie (raz za wcześnie i raz o czasie).
Dziwi mnie że ten błąd nie został nigdzie znaleziony czy
przedyskutowany. Nie mogę niestety znaleźć znaleźć dokładnej
specyfikacji POSIXowego sleepa, ale zakładam że działa prawidłowo
(sprawdzałem zachowanie na PLD, fedorze i SuSe, wszędzie tak samo,
test załączony na końcu).
Niestety hc-cron zakończył development w 2002 roku.
Błąd nie występuje gdy nie jest ustawione makro USE_SIGCHLD, w
przypadku linuksa jest.
Prosiłbym o sprawdzenie u siebie czy występują czasem zduplikowane
zadania, najprościej tak:
egrep :5.- /var/log/cron
Sprawdza to czy były uruchamiane zadania w ostatnich 10 sekundach
minuty, normalnie nie powinny.
Program testujący sleepa:
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
void handler(int sig) {
int i = 0;
i++; // DUMMY
}
int main(int argc, char **argv) {
time_t t;
struct timeval tv;
signal(SIGCHLD, handler);
time(&t);
while(time(NULL) == t);
if(!fork()) {
usleep(100000);
exit(0);
}
printf("nnAfter ~100ms: %dnn", sleep(10));
fflush(stdout);
time(&t);
while(time(NULL) == t);
if(!fork()) {
usleep(600000);
exit(0);
}
printf("nnAfter ~500ms: %dnn", sleep(10));
fflush(stdout);
return 0;
}
Wynik u mnie:
After ~100ms: 10
After ~500ms: 9
W przypadku sleepa który nie zaokrągla wyników byłoby to 10 i 10.
For more further see:
http://bugs.pld-linux.org/index.php?do=details&id=5647&area=comments#tabs}
------------------------------------------------------------------------
THIS IS AN AUTOMATICALLY GENERATED MESSAGE, DO NOT REPLY
More information about the pld-bugs
mailing list