Hány órát vezet a rendszer? [Megoldva]

Fórumok

Sziasztok!

Egy fájlal történő lockolási rendszert próbáltam összerakni, ami belépéskor engedi lefutni a cuccot, de újabb bash futtatásakor már nem. Ez lényegtelen is, azóta megoldottam bash_profile-al, de belefutottam ebbe az érdekes jelenségbe:

>> touch ~/lock
>> python -c "import os, time; print int(time.time()) - os.stat('~/lock')[-2]"
82

És hogy ez hogy. Oké, a két másodperc eltérés lehet az, hogy lassan adtam ki a következő sort, de 82? Többször megismételtem, és mindig kb 80 másodperc eltérés volt a time.time() által lekért rendszeridő és a touch által beállított last mod idő között.

Megoldás: távoli fájlrendszerről van felcsatolva a home.

Hozzászólások

touch lock ; python -c "import os, time; print int(time.time()) - os.stat('lock')[-2]"
0

Viszont:

$ python -c "import os, time; print int(time.time()) - os.stat('~/lock')[-2]"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '~/lock'

Nincs egy kóbor /lock-od véletlenül?

user@server:~$ date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;date;
Tue Mar 13 16:21:32 CET 2012

És ugyanez a sor sokszor. 80 másodperc eltérésben kellene lennie legalább egy percnek.
----
Hülye pelikán

Nálam jó.
lacyc3@lacyc3-gentoo-desktop ~ $ touch lock
lacyc3@lacyc3-gentoo-desktop ~ $ python -c "import os, time; print int(time.time()) - os.stat('lock')[-2]"
5
lacyc3@lacyc3-gentoo-desktop ~ $ python --version
Python 2.7.2

Milyen python verziót használsz ?

Nekem 2.6.6 -os van és működik.

Ezt csak egy gépen próbáltad vagy van másik hasonló géped ugyanolyan OS-el kipróbálni ?

touch lock; echo $(( $(date +%s) - $(stat --format %Y lock) )); rm lock

Hardveresen minden CPU-ban, es az alaplapon is van egy ora. Legalabb. A kernelben pedig sok idomanipulacios fugveny van, amit a userland libek kovethetetlen mennyisegben hasznalnak ;)

A python time.time() az a gettimeofday() syscallt hivja, a date parancs pedig a clock_gettime() syscallt.
A clock_gettime() tobbfelekeppen ertelmezheti az idot (tobb "ora" van), de ez nem az, amit keresel.

Lassuk az alabbi C programot, ami par syscallt meghiv:


// compile: cc -lrt a.c
#include <time.h>
#define CLOCK_MONOTONIC_RAW           4
#include <sys/time.h>
#include <stdio.h>

int main()
{
        struct timeval tv;
        struct timespec ts1, ts2, ts3, ts4;
        gettimeofday(&tv,NULL);
        clock_gettime(CLOCK_REALTIME, &ts1);
        clock_gettime(CLOCK_MONOTONIC, &ts2);
        clock_gettime(CLOCK_MONOTONIC_RAW, &ts3);
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts4);

        printf("gettimeofday():                    %ld.%06ld\n", tv.tv_sec, tv.tv_usec);
        printf("clock_gettime(realtime):           %ld.%09ld\n", ts1.tv_sec, ts1.tv_nsec);
        printf("clock_gettime(monotonic):          %ld.%09ld\n", ts2.tv_sec, ts2.tv_nsec);
        printf("clock_gettime(monotonic_raw):      %ld.%09ld\n", ts3.tv_sec, ts3.tv_nsec);
        printf("clock_gettime(process_cputime_id): %ld.%09ld\n", ts4.tv_sec, ts4.tv_nsec);

        return 1;
}

Nálam a fenti program kimeneteben a gettimeofday() és a clock_gettime(realtime) kozott pont annyi kulonbseg van, amennyit a ntpdate modositott.

Hogy a gettimeofday() es a clock_gettime() miert ad kulonbozo eredmenyt, az inkabb hiba, mintsem helyes mukodes.

Megoldas: a lockfile tartalma legyen az az ido, ami neked ido:-)
ne stat() -olj.
Mellesleg a lockfile legyen symlink, mert annak ellenrozese es krealasa atomi.

Es ez mit ir ki:

python -c "import os, time; print os.stat('lock')"

A home-od nem lehet hogy valami távoli fájlrenedszeren van, ahol a fájl készítésekor a távoli gép állítja be az időt az övére?

Meglepődtem, mert azt hittem hogy baromságot írok. :) Pont az ilyen anomáliák kiszűrése miatt szerintem távoli fájlrendszer esetén az lenne a helyes viselkedés, hogy a kliens közli a szerverrel a létrehozandó fájl időcímkéjét. Bár hirtelen nem látom át, hogy az milyen másmilyen anomáliákat szülne.

Egyébként konkrétan milyen hálózati fájlrendszer?