17.12.2023, Vladimír Klaus, navštíveno 390x
Pro potřeby rychlejšího a pohodlnějšího spouštění aplikací na serveru jsem se rozhodl celou věc zautomatizovat. Řekněme tedy že jsem přihlášen na Windows Serveru, řeším nějaké záležitosti, instaluji aktualizace apod. No a pak je třeba server restartovat. To může trvat různou dlouho dobu a já potřebuji, aby se poté téměř ihned spustily nějaké aplikace a třeba mi i o tom přišel e-mail. Je to zkrátka sada několika kroků, které se mi už nechtělo dělat ručně.
Ale jsou tu i další požadavky. Potřebuji zajistit, aby byla každá z aplikací byla spuštěna jen jednou (dá se sice řešit při vývoji aplikace, ale pokud ji neprogramujete...). A protože se aplikace připojují k SQL Serveru, může být vhodné jejich start o chvilku odložit, protože ihned po restartu Windows Serveru nemusí SQL Server ještě úplně běžet a musel by se tak řešit další problém.
Spuštění aplikací
Tímto dávkovým souborem zajistím spuštění všech aplikací. Pokud ovšem daná aplikace běží, nebude se spouštět její další instance.
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
CALL :spustAplikaci Aplikace1.exe "c:\Program Files (x86)\AUDREY software\Aplikace1.exe"
CALL :spustAplikaci Aplikace2.exe "c:\Program Files (x86)\AUDREY software\Aplikace2.exe"
GOTO :konec
rem ------------------------------------------------------------------
rem Kontrola, zda je daná aplikace spuštěná, a pokud ne, spustí ji
rem Když je cesta v uvozovkách, musí se nejprve uvést prázdné uvozovky, což značí titulek okna
rem a až další parametr je chápán jako cesta k aplikaci
:spustAplikaci
echo Kontroluji/spoustim %1...
tasklist /FI "IMAGENAME eq %1" 2>NUL | find /I /N "%1">NUL
if "%ERRORLEVEL%"=="1" start "" ""%2""
rem ------------------------------------------------------------------
:konec
ENDLOCAL
rem Timto konci tato davka, ale pripadne pokracuje ta, ze ktere bych tuto volal
exit /b
Soubor uložte jako d:\spustit-aplikace.cmd.
Poslání e-mailu
Windows posílání e-mailu podporují pouze prostřednictvím Power Shellu. A PS skript není možné jednoduše spustit poklepáním na daný soubor *.ps1. Takže při ladění, ale i třeba později si musíte moci dávkovým souborem.
Nejprve si připravte PowerShell skript pro posílání e-mailu. Nevýhodou je, že s heslem musíte nakládat speciálním způsobem, a také že je uvedeno přímo v souboru.
$password = ConvertTo-SecureString "vaše-heslo" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential("odesílatel@nějaký-email.cz", $password)
Send-MailMessage -From "odesílatel@nějaký-email.cz" -To "příjemce@nějaký-email.cz"
-Subject "Aplikace byly spuštěny" -Body "Informace o tom, že byly aplikace spuštěny"
-SmtpServer "smtp.nějaký-server.com" -Port 25 -Credential $credential
Soubor uložte třeba do d:\poslat-email.ps1.
A pak si připravte dávkový soubor, ve kterém daný skript jednoduše a bez dalšího vyptávání spustíte.
@echo off
powershell -ExecutionPolicy Bypass -File "d:\poslat-email.ps1"
exit /b
Soubor uložte jako d:\poslat-email.cmd.
Souhrnný dávkový soubor
Ve výsledném souboru už jen postupně zavoláme oba dávkové soubory. Samozřejmě je třeba si uvědomit, že k odeslání e-mailu může dojít dřív, než se aplikace spustí. To už byste pak museli řešit další kontrolou založenou na nějakých dalších informacích. Zde je pouze důležité, aby oba volané dávkové soubory končily "exit /b", tedy aby předaly řízení zpět tomuto hlavnímu souboru.
@echo off
call d:\spustit-aplikace.cmd
call d:\poslat-email.cmd
pause
Soubor uložte jako d:\KOMPLETNI-spusteni.cmd.
Naplánování spuštění po restartu
K naplánování po restartu využijeme Plánovač úloh. Zde je důležité především vybrat, že chcete úlohu spustit bez ohledu na to, zda se uživatel přihlásí či nikoliv.
Na další kartě vyberte, že má být spuštěna po startu a třeba s 5minutovým zpožděním.
Následuje už jen výběr hlavního souboru, případně můžete (pro jistotu) nastavit ještě složku, ve které se má spustit. Sice všude uvádíte absolutní cesty, ale tímhle se nic nezkazí.
A to je vše. Nezbývá, než ručně vyzkoušet d:\KOMPLETNI-spusteni.cmd, no a pak i třeba restarovat server. 😉