A munkahelyi Windows-omat minden hazamenetel előtt hibernálom. Nem szeretem bekapcsolva hagyni, mert feleslegesen minek fogyassza az áramot cirka 16 órán keresztül (Ez kb 5. kWh villamos energia munka naponta. A maradék szabad napokon pedig 24 órás feleslegesség. Mind összesen köbö (220 nap/év * 5 kWh/nap + 140 nap/év * 8 kWh/nap) *50 Ft/kWh = 111000 Ft/év + 777 kg CO2 kibocsátás. Hogy az egyebekről ne beszéljek). A lelövés után viszont sokáig tart kézzel elindítgatni az összes programot.
Tehát én hibernálni szeretem a gépet. Viszont bizonyos programok ilyen esetben kiidősödnek (l. timeout-ra futnak) és pl. az ssh bonthatja a kapcsolatot. Ez akkor probléma, ha mondjuk egy vim nyitva volt az adott konzolon és az swp file-ok elkezdenek feltorlódni. Erre a problematikára kerestem egy viszonylag fájdalommentes megoldást.
A konkrét problémám tehát, hogy Cygwin-es urxvt alatt szoktam ssh kapcsolatokat nyitogatni, majd ezekkel dolgozgatni. Viszont az urxvt képes több tab-ot is nyitni, így nem mindig jut eszembe az összes nyitott ssh-t lelövögetni. Tehát jó lenne, ha hibernálás/leállítás előtt megcsinálná nekem egy szkript.
Első kérdésként az merül fel, hogyan lehet parancssorból hibernálni. Erre a shutdown parancs helpjéből könnyen választ kaphatunk:
C:\>shutdown /?
Usage: shutdown [/i | /l | /s | /r | /g | /a | /p | /h | /e] [/f]
[/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]]
...
/h Hibernate the local computer.
Can be used with the /f option.
Tehát mielőtt ezt kiadnám, meg kellene nézni, hogy az ssh.exe fut-e. Erre a tasklist.exe parancsot lehet használni:C:\> tasklist /NH /Fi "IMAGENAME eq ssh.exe"
Ha talál ilyet, akkor ez a kimenete:ssh.exe 6344 Console 1 9 276 K
Ha nem fut, akkor pedig:INFO: No tasks are running which match the specified criteria.
Sajnos ha nem talál megfelelő programot, akkor nem tér vissza 1-es exit kóddal. Hát igen, ez még mindig DOS. Tehát trükközni kell! Írtam hát egy halt.bat DOS szkriptet, ami megnézi, hogy fut-e ssh.exe: Ha fut, akkor felkéri a felhasználót a kézi intervencióra. Ha nem fut, akkor leállítja a gépet. Így nézünk most ki:
@echo off
SETLOCAL EnableExtensions
set EXE=ssh.exe
:LOOP
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
echo %EXE% not running...
goto FIN
:FOUND
echo %EXE% is still running!
pause
goto LOOP
:FIN
shutdown %*
Használat: halt /h - hibernálás, halt /s - leállítás. A /t-vel tudnánk várakozást is beiktatni a lelövés előtt. De valamilyen általam nem értelmezhető okból a hibernációra nem vonatkozik. Szépen végiggondolt megoldás!
Ha szükségünk úgy hozza, hogy egy bizonyos dll használatát kell górcső alá vennünk, akkor a
tasklist /NH /FI "MDOULES eq cygwin1.dll"
parancsot használhatjuk. De van lehetőség egy mintával való egyezés figyelésére is:
tasklist /NH /M cyg*
Most, hogy már megvan a batch szkript el kellene indítani. Én a Start menü-höz való hozzáadást választottam az asztal újabb ikonokkal való telepakolása helyett, mert az asztalom ritkán látszik ki a rengeteg program alól, a taskbar-ba való kiszögezést meg feleslegesnek tartom, mert olyan sűrűn viszont nem használom. Tehát
Start gomb -> Recently run program: bármelyiket kiválasztani -> jobb klikk -> "Pin to Start Menu" -> jobb klikk -> Properties ->
{General} Hibernate
{Shortcut}
Target: C:\cygwin\halt.bat /h
[Change Icon...] %SystemRoot%\System32\shell32.dll -> Itt a kék gombot választottam. Sajnos sárga nincs.
A shutdown-ra pedig ugyanezt megismételve, hogy a {General} fülön a nevet Shutdown-ra változtattam, a {Shortcut} fülön pedig a "Target:" lett "C:\cygwin\halt.bat /s" és piros gomb az ikonja.
A batch írása közben egy furcsaságba futottam bele. Eleinte a Total Commander gomb sorába akartam betenni a batch file meghívását. De valami miatt a dll modulok keresése piszok lassú lett (de az exe-ket hipp-hopp megtalálta). 20-25 másodpercet is eltökörészett, amíg kilistázott 3 alkalmazást. Tehát 64 bites Windows-on 32 bites TC-t futtatva (ez volt alapban fent) kiadtam a "tasklist /NH /M cygwin1.dll" parancsot (akár a batch file-ra kattintással, vagy a Command prompt elindításával TC menüből, vagy a saját command prompt-jába való beírással) és 25 s után kaptam választ. Ezt be is jelentettem a TC honlapján (>itt<) és jött is egy ötlet, de a megoldásra nekem kellett rájönni. A C:\Windows könyvtár alatt kerestem cmd.exe file-okat. Négy is jött a System32 (64 bites), SysWOW64 és kettő a winsxs könyvtár alatt. Mind a néggyel megpróbáltam és végül találtam egyet, amin gyorsan jött a válasz:
SET CMD=c:\Windows\winsxs\amd64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7601.17514_none_e932cc2c30fc13b0\cmd.exe
%CMD% /C tasklist /NH /FI "MODULES eq cygwin1.dll"
Álljunk le minden nap!
+jegyzések