Háttérfolyamatok időkorlátozása

Mindezek figyelembevételével a munkamenetekkel készíthetünk egy olyan megoldást, amellyel biztosíthatjuk, hogy egy szkriptünk egy -TimeOut paraméterhez megadható maximális ideig futhat csak. Ehhez a Wait-Job -timeout paraméterét használhatjuk fel. Íme az Invoke-Job függvény:

function Invoke-Job{

param(

    [scriptblock] $ScriptBlock = {},

    [int] $timeout = -1

)

    $job = start-job -ScriptBlock $ScriptBlock

    Wait-Job -Timeout $timeout -Job $job

    Stop-Job -Job $job

    Receive-Job -Job $job

    Remove-Job -Job $job

}

 Ezzel például a teljes C: kilistázása maximum 3 másodpercig ezt eredményezi:

PS C:\> Invoke-Job -ScriptBlock {Get-ChildItem c:\ -Recurse -ErrorAction Silent

lyContinue} -timeout 3

 

 

    Directory: C:\

 

 

Mode                LastWriteTime     Length Name

----                -------------     ------ ----

d-r--       2014.11.29.     11:43            Documents

d----       2014.12.13.     22:38            Downloads

d----       2014.10.28.     12:51            drivers

d----       2014.10.28.     14:36            Intel

d----       2014.10.28.     13:27            NVIDIA

d----       2009.07.14.      5:20            PerfLogs

Azaz korántsem kaptuk meg az összes fájlt, de sok esetben praktikus valamilyen felső határt szabni a szkriptjeink futásának. Természetesen ezt a megoldást lehetne finomítani, például valamilyen hibát, vagy figyelmeztetést lehetne kiírni, ha a timeout miatt kellett megállítani a futtatást és nem pedig magától fejezte be a teendőjét.

 Háttérfolyamatok tehát főleg olyan parancsok futtatása esetén fontosak, amelyek hosszú ideig futnak. Néhány parancs már előre tudhatóan hosszú ideig fog futni, így ezek esetében van egy ‑AsJob kapcsoló, amely a fenti külön munkamenet létrehozása nélkül már eleve háttérfolyamatként futtatja a parancsot. Keressük ki ezeket a parancsokat:

[1] PS C:\> PS C:\> Get-Help * -Parameter asjob

 

Name                              Category  Synopsis

----                              --------  --------

Invoke-Command                    Cmdlet    Runs commands on local and...

Get-WmiObject                     Cmdlet    Gets instances of Windows ...

Invoke-WmiMethod                  Cmdlet    Calls Windows Management I...

Remove-WmiObject                  Cmdlet    Deletes an instance of an ...

Set-WmiInstance                   Cmdlet    Creates or updates an inst...

Test-Connection                   Cmdlet    Sends ICMP echo request pa...

Restart-Computer                  Cmdlet    Restarts ("reboots") the o...

Stop-Computer                     Cmdlet    Stops (shuts down) local a...

Például a Restart-Computer biztos hosszadalmas folyamat, hiszen le kell állítani a futó folyamatokat, ami nem két pillanat. Vagy hasonlóan a Test-Connection  is ilyen cmdlet, amellyel gyakorlatilag „pingetni” lehet gépeket:

PS C:\Users\TEMP> Test-Connection dc -AsJob

 

WARNING: column "Command" does not fit into the display and was removed.

 

Id              Name            State      HasMoreData     Location

--              ----            -----      -----------     --------

5               Job5            Running    False           .

 

 

PS C:\Users\TEMP> Receive-Job 5

 

WARNING: 2 columns do not fit into the display and were removed.

 

Source        Destination     IPV4Address      IPV6Address

------        -----------     -----------      -----------

MEMBER        dc              192.168.1.10     {}

Itt tehát a parancs maga hozta létre a munkamenetet, a lekérdezése ugyanúgy Receive-Job cmdlet segítségével történhet.

És ilyen lehet az invoke-command  cmdlet is, amellyel parancsokat hajtathatunk végre akár saját gépünkön, akár más gépeken is távolról. Ez utóbbi már átvezet minket a következő témánkba, a távoli parancsfuttatás világába.



Word To HTML Converter