Batch véletlen várakozás

Csak egy rövid feljegyzés magamnak, ill. bárkinek, akinek hasznos lehet. Random várakozás egy batch scriptbe olyan helyekre, ahol a %RANDOM% nem elég random (másodperc pontossággal seed-elt PRNG van mögötte, így pl. egy AD domainben, ahol szépen szinkronizálva vannak a gépek órái, egy PsExec-kel hívott scriptbe beszúrt %RANDOM% nagy valószínűséggel ugyanazt fogja adni minden gépen - ami nem feltétlenül jó, ha a cél az, hogy az összes gép ne egyszerre fogja le a szervert). Ehelyett:


set /a rand_wait=(((%TIME:~9,2%+1)*6))
timeout /T %rand_wait%

A %TIME% 10. és 11. karaktere a milliszekundum két számjeggyel (0-99), így a rand_wait 6 - 600 közötti értéket vesz fel, ami másodpercben (amit a timeout vár) 10 perc.

BlackY

Hozzászólások

O"o", de miert is jobb ez, ha szinkronizálva vannak a gépek órái, mint ahogy irod? NTP is siman tud 1millisec alatti driftet...

Az mondjuk ketsegtelen, hogy barmilyen shell-ben a RANDOM az egy kaki...:/ Esetleg uuidgen alapokon? Kersz egyet, Lecsapod az utolso 2 hexa jegye't, ertelmezed mint 0...255 kozotti ege'sz, oszt annyi. Az uuid elvileg hwaddr alapjan is dolgozik, az meg eselyes hogy kulonbozik ke't ge'pen.

Mert a PsExec (a detach opcióval) gyors _egymás utánban_ indítja el a gépeken - a %RANDOM% így messze nem elég random (30 gépnél 1 max. 2 másodperc alatt meg van), a fenti viszont szép nagy szórást eredményez :)

uuidgen Win alatt nem csak Visual Studio telepítés után érhető el?

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

A win-t nem ismerem (mmint hogy az uuidgen-nek milyen fuggosegei vannak), de azt latom hogy win-es backenddel rendelkezo dolgok igencsak szeretik az uuid-et hasznalni ;) Szoval vmi support csakcsak van, hogy nativan (shellbol) tudd ele'rni.

Aha, igen, ha mondjuk 0.05 masodpercenkent indulnak a processzek, akkor a millisec mar valoban fog annyit szo'rni hogy ne legyen gond. Csak aztan nehogy x e'v mulva legyen gond, hogyha a gepek gyorsulasa miatt vagy aka'r PS upgrade miatt ez ma'r (ujra) race condition-szeruseget okoz.

"Szoval vmi support csakcsak van, hogy nativan (shellbol) tudd ele'rni."

Nincs. Powershellbol elo lehet banyaszkodni a C#-os assemblyt/osztalyt (fejbol mar nem tudom, hogy melyik nevterben van, es az betoltodik-e alapbol) es abbol lehet bohockodni egy UUID-et, de parancs meg abban sincs ra. Batch-bol pedig nativ eszkozokkel elerhetetlen.

Egyebkent ha a gepek gyorsulnak, akkor valszinu a szerver is gyorsul annyit, hogy eleg legyen a kapacitas tobb kliens kezelesehez is :-)
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Egyebkent ha a gepek gyorsulnak, akkor valszinu a szerver is gyorsul annyit, hogy eleg legyen a kapacitas tobb kliens kezelesehez is :-)

Yup :) Vagy ha mégsem, akkor bízunk abban, hogy az MS a későbbiekben sem akar pontosabb NTP klienst csinálni, most 1-2 másodperc pontosságot tart a Wiki szerint :)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Erre nem érné meg egy pár soros apró C vagy C# kódot írni, ami egy printf-el kitolná a RAND értéket? Vagy éppen várakozna annyit?

Vagy nem kivitelezhető telepíteni egy Ruby-t vagy Python-t vagy egyebet és abból printelni egy erős random értéket?

Vagy mindenképpen csak a klienseken elérhető eszközökből akarsz generálni?

"delayed expansion" nem jó?
http://superuser.com/questions/588401/random-number-in-a-batch-file-doe…

Egy Powershell-re átírás előbb-utóbb lehet, hogy kell majd, csak lusta voltam utánanézni, hogy abból hogy tudok network drive-ot csatolni (különösen más user nevében), vbscriptet indítani, ilyesmik; a klienseken elérhetőség nem árt, és csak ezért nem szívesen raknék fel plusz interpretert.

A delayedexpansion szvsz. nem segít, mert a script elején akarok várakozni és ott még nincs elég tényező (a psexec kiadása és a futásban a várakozásig elérés ugyanaz a másodperc), hogy befolyásolja a kapott értéket.

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)