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.
- 3809 megtekintés
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?
- A hozzászóláshoz be kell jelentkezni
Na ez is érdekes, most valamiért nem akarja megenni a home könyvtáramból. De mindegy, mert ezt kiadva:
user@server:~$ touch lock ; python -c "import os, time; print int(time.time()) - os.stat('lock')[-2]"
79
Néha 80. Szóval az eredmény ugyanaz.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Dual-core masina és a két cpu clock nem jár kéz a kézben? Nekem régesrég volt ilyen. A date;date;date;date (és esetleg még sok date) mit ad vissza?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Én itt kifogytam az ötletekből :(
- A hozzászóláshoz be kell jelentkezni
Nem lehet valami float -> <-int konverziós "hiba"?
- A hozzászóláshoz be kell jelentkezni
user@server:~$ touch lock ; python -c "import os, time; print time.time() - os.stat('lock')[-2]"
79.5395879745
Nem.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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 ?
- A hozzászóláshoz be kell jelentkezni
>> python --version
Python 2.6.4
Kipróbáltam egy másik, elvileg hasonló gépen, ott
user@server2:~$ touch lock ; python -c "import os, time; print time.time() - os.stat('lock')[-2]"
-1272.03675795
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Es ez mit ir ki:
python -c "import os, time; print os.stat('lock')"
- A hozzászóláshoz be kell jelentkezni
>> python -c "import os; print os.stat('lock')"
posix.stat_result(st_mode=33188, st_ino=19035120L, st_dev=81002698L, st_nlink=1, st_uid=61344608, st_gid=300, st_size=0L, st_atime=1331714616, st_mtime=1331714616, st_ctime=1331714616)
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
>> touch /tmp/lock ; python -c "import os, time; print int(time.time()) - os.stat('/tmp/lock')[-2]"
0
De. Köszi a megoldást :)
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Én sem értem, hogy miért nem a touch-t végrehajtó oldal adja meg az időt.
Hogy milyen nwfs? Ezt nem tudom, és valószínűleg company confidential is.
----
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Szerintem a sima "mount" avagy "cat /proc/mounts" kimenetéből kibogarászható: nfs, smbfs, vagy valami ilyesmi lesz gondolom.
- A hozzászóláshoz be kell jelentkezni