/ / Môže sa obnoviť a znovu spustiť samostatný ruby ​​skript (windows a mac)? - okná, rubín, exec, reload, reštart

Môže sa samostatný rubínový skript (windows a mac) znovu načítať a reštartovať? windows, ruby, exec, reload, restart

Mám architektúru majstrov-pracovníkov, kdetýždenne rastie počet pracovníkov. Už nemôžem očakávať, že ssh alebo vzdialenú konzolu do každého stroja zabijú pracovníka, urobia synchronizáciu ovládania zdroja a reštart. Chcel by som mať možnosť umiestniť správu v sieti, ktorá každému zariadeniu umožní synchronizovať a reštartovať.

To je miesto, kde som narazil na zátaras. Ak by som používal nejakú rozumnú platformu, mohol by som to urobiť:

exec("ruby", __FILE__)

... a treba urobiť. Urobil som však nasledujúci test:

p Process.pid
sleep 1
exec("ruby", __FILE__)

...a vo Windows, dostanem jeden ruby ​​inštanciu pre každé volanie exec. Nikto z nich nezomrie, kým na príslušnom okne nenasledujem ^ C. Na každej platforme, na ktorej som to skúšal, sa zakaždým vykonáva nová verzia súboru, čo som si overil jednoduchými úpravami testovacieho skriptu počas testu.

Dôvod, prečo som tlačil pid jeDvakrát skontrolujte správanie, ktoré vidím. Na oknách dostávam inú pid s každým spustením - čo by som očakával, vzhľadom na to, že vidím nový proces v správcovi úloh pre každý beh. pid je rovnaký pre každé systémové volanie a ja som overil s dtrace, že každý beh spúšťa volanie na execve syscall.

Stručne povedané, existuje spôsob, ako získať oknáRuby skript na reštartovanie jeho spustenia, takže bude bežať akýkoľvek kód - vrátane samotného - ktorý sa zmenil počas jeho vykonávania? Všimnite si prosím, že toto nie je aplikácia pre koľajnice, aj keď používa aktivačný záznam.

odpovede:

2 pre odpoveď č. 1

Po vyskúšaní viacerých riešení (vrátane toho, ktorý predložil Byron Whitlock, ktorý ma nakoniec dostal na cestu k uspokojivému cieľu) som sa rozhodol:

IO.popen("start cmd /C ruby.exe #{$0} #{ARGV.join(" ")}")
sleep 5

Zistil som, že keď som vôbec nespalPopen, a práve odišiel, spawn by často (> 50% času) zlyhá. To samozrejme nie je multiplatformné, takže ak chcete mať rovnaké správanie na počítači Mac:

IO.popen("xterm -e "ruby blah blah blah"&")

0 pre odpoveď č. 2

Klasickým spôsobom reštartovania programu je napísať ďalší, ktorý to robí za vás. tak si splodíte proces restart.exe <args>potom zomrieť alebo odísť; restart.exe čaká, kým volajúci skript už nie je spustený, potom znova spustí skript.