about_Remote_Jobs

Rövid leírás

A háttérfeladatok távoli számítógépeken való futtatását ismerteti.

Részletes leírás

A PowerShell egyszerre futtat parancsokat és szkripteket a feladatokon keresztül. A PowerShell három feladattípust biztosít az egyidejűség támogatásához.

  • RemoteJob – A parancsok és szkriptek távoli munkamenetben futnak.
  • BackgroundJob – A parancsok és szkriptek külön folyamatban futnak a helyi gépen. További információkért lásd a feladatokat ismertető szakaszt.
  • PSTaskJob vagy ThreadJob – A parancsok és szkriptek külön szálon futnak ugyanazon a folyamaton belül a helyi gépen. További információ: about_Thread_Jobs.

A szkriptek távoli, külön gépen vagy külön folyamatban történő futtatása nagy elkülönítést biztosít. A távoli feladatban előforduló hibák nem érintik a többi futó feladatot vagy a feladatot elindító szülőmunkamenetet. A remoting réteg azonban többletterhelést okoz, beleértve az objektumszerializálást is. Az összes objektum szerializálva és deszerializálva van, ahogy a szülőmunkamenet és a távoli (feladat-) munkamenet között átadják őket. A nagy méretű, összetett adatobjektumok szerializálása nagy mennyiségű számítási és memória-erőforrást használhat fel, és nagy mennyiségű adatot vihet át a hálózaton.

Fontos

A feladatot létrehozó szülőmunkamenet a feladat állapotát is figyeli, és folyamatadatokat gyűjt. A feladat gyermekfolyamatát a szülőfolyamat leállítja, amint a feladat befejezett állapotba kerül. Ha a szülőmunkamenet le van állítva, a rendszer az összes futó gyermekfeladatot leállítja a gyermekfolyamatokkal együtt.

Kétféleképpen lehet megkerülni ezt a helyzetet:

  1. A használatával Invoke-Command leválasztott munkamenetekben futó feladatokat hozhat létre. Tekintse meg a cikk leválasztott folyamatok szakaszát.
  2. A használatával Start-Process nem feladat, hanem új folyamat hozható létre. További információ: Start-Process.

Távoli feladatok

A távoli számítógépeken három különböző módszerrel futtathat feladatokat.

  • Interaktív munkamenet indítása távoli számítógépen. Ezután kezdjen el egy feladatot az interaktív munkamenetben. Az eljárások megegyeznek a helyi feladat futtatásával, bár minden műveletet a távoli számítógépen hajtanak végre.

  • Futtasson egy feladatot egy távoli számítógépen, amely visszaadja az eredményeket a helyi számítógépnek. Ezt a módszert akkor használja, ha a feladatok eredményeit szeretné összegyűjteni és a helyi számítógépen egy központi helyen tartani.

  • Futtasson egy feladatot egy távoli számítógépen, amely megőrzi az eredményeit a távoli számítógépen. Ezt a módszert akkor használja, ha a feladatadatok biztonságosabban megmaradnak az eredeti számítógépen.

Feladat indítása interaktív munkamenetben

Elindíthat egy interaktív munkamenetet egy távoli számítógéppel, majd elindíthat egy feladatot az interaktív munkamenet során. Az interaktív munkamenetekről további információt a about_Remote és a következő témakörben talál Enter-PSSession: .

A feladatok interaktív munkamenetben való elindításának eljárása majdnem megegyezik a helyi számítógépen futó háttérfeladat indításának eljárásával. Az összes művelet azonban a távoli számítógépen történik, nem a helyi számítógépen.

  1. Enter-PSSession A parancsmaggal interaktív munkamenetet indíthat egy távoli számítógéppel. A ComputerName paraméterével Enter-PSSession ideiglenes kapcsolatot hozhat létre az interaktív munkamenethez. Vagy a Munkamenet paraméterrel futtathatja az interaktív munkamenetet egy PowerShell-munkamenetben (PSSession).

    A következő parancs elindít egy interaktív munkamenetet a Server01 számítógépen.

    C:\PS> Enter-PSSession -computername Server01
    

    A parancssor úgy változik, hogy ön most már csatlakozik a Server01 számítógéphez.

    Server01\C:>
    
  2. Ha távoli feladatot szeretne elindítani a munkamenetben, használja a Start-Job parancsmagot. A következő parancs egy távoli feladatot futtat, amely lekéri az eseményeket a Server01 számítógép Windows PowerShell eseménynaplójában. A Start-Job parancsmag egy objektumot ad vissza, amely a feladatot jelöli.

    Ez a parancs menti a feladatobjektumot a $job változóba.

    Server01\C:> $job = Start-Job -scriptblock {
      Get-Eventlog "Windows PowerShell"
    }
    

    A feladat futtatása közben az interaktív munkamenet használatával más parancsokat is futtathat, beleértve az egyéb feladatokat is. A feladat befejezéséig azonban nyitva kell tartania az interaktív munkamenetet. Ha befejezi a munkamenetet, a feladat megszakad, és az eredmények elvesznek.

  3. Ha meg szeretné tudni, hogy a feladat befejeződött-e, jelenítse meg a $job változó értékét, vagy használja a Get-Job parancsmagot a feladat lekéréséhez. A következő parancs a Get-Job parancsmaggal jeleníti meg a feladatot.

    Server01\C:> Get-Job $job
    
    SessionId  Name  State      HasMoreData  Location   Command
    ---------  ----  -----      -----------  --------   -------
    1          Job1  Complete   True         localhost  Get-Eventlog "Windows...
    

    A Get-Job kimenet azt mutatja, hogy a feladat a "localhost" számítógépen fut, mert a feladat elindult, és ugyanazon a számítógépen fut (ebben az esetben: Server01).

  4. A feladat eredményeinek lekéréséhez használja a Receive-Job parancsmagot. Az eredményeket megjelenítheti az interaktív munkamenetben, vagy mentheti őket egy fájlba a távoli számítógépen. A következő parancs lekéri a feladat eredményeit a $job változóban. A parancs az átirányítási operátor (>) használatával menti a feladat eredményeit a Server01 számítógépen található PsLog.txt fájlba.

    Server01\C:> Receive-Job $job > c:\logs\PsLog.txt
    
  5. Az interaktív munkamenet befejezéséhez használja a Exit-PSSession parancsmagot. A parancssor úgy változik, hogy a helyi számítógépen újra az eredeti munkamenetben van.

    Server01\C:> Exit-PSSession
    C:\PS>
    
  6. Ha bármikor meg szeretné tekinteni a PsLog.txt fájl tartalmát a Server01 számítógépen, indítson el egy másik interaktív munkamenetet, vagy futtasson egy távoli parancsot. Ez a parancstípus akkor a legjobb, ha PSSession (állandó kapcsolat) környezetben fut, ha több parancsot szeretne használni a PsLog.txt fájlban lévő adatok vizsgálatához és kezeléséhez. A PSSessions szolgáltatással kapcsolatos további információkért lásd: about_PSSessions.

    Az alábbi parancsok a New-PSSession parancsmaggal hoznak létre egy, a Server01 számítógéphez csatlakoztatott PSSessiont , és a Invoke-Command parancsmaggal futtatnak egy Get-Content parancsot a PSSessionban a fájl tartalmának megtekintéséhez.

    $s = New-PSSession -computername Server01
    Invoke-Command -session $s -scriptblock {
      Get-Content c:\logs\pslog.txt}
    

Távoli feladat indítása, amely visszaadja az eredményeket a helyi számítógépnek (AsJob)

Ha olyan távoli számítógépen szeretne feladatot indítani, amely visszaadja a parancseredményeket a helyi számítógépnek, használja egy parancsmag AsJob paraméterét, például a Invoke-Command parancsmagot.

Az AsJob paraméter használatakor a feladatobjektum ténylegesen létrejön a helyi számítógépen annak ellenére, hogy a feladat a távoli számítógépen fut. A feladat befejezése után a rendszer visszaadja az eredményeket a helyi számítógépnek.

A Feladat főnevét (a Feladat parancsmagokat) tartalmazó parancsmagokkal kezelheti a parancsmagok által létrehozott feladatokat. Az AsJob-paraméterekkel rendelkező parancsmagok közül sok nem használja a PowerShell-távelérést, így azokat olyan számítógépeken is használhatja, amelyek nincsenek konfigurálva az újraegyenlítésre, és amelyek nem felelnek meg az újraegyenlítés követelményeinek.

  1. A következő parancs a AsJob paraméterével Invoke-Command indít el egy feladatot a Server01 számítógépen. A feladat futtat egy Get-Eventlog parancsot, amely lekéri az eseményeket a rendszernaplóban. A JobName paraméterrel megjelenítendő nevet rendelhet a feladathoz.

    Invoke-Command -computername Server01 -scriptblock {
      Get-Eventlog system} -AsJob
    

    A parancs eredménye az alábbi mintakimenethez hasonló.

    SessionId   Name   State    HasMoreData   Location   Command
    ---------   ----   -----    -----------   --------   -------
    1           Job1   Running  True          Server01   Get-Eventlog system
    

    Az AsJob paraméter használatakor ugyanazt a feladatobjektumtípust adja vissza, Invoke-Command amelyet Start-Job visszaad. A feladatobjektumot mentheti egy változóban, vagy egy Get-Job paranccsal lekérheti a feladatot.

    Vegye figyelembe, hogy a Location (Hely) tulajdonság értéke azt mutatja, hogy a feladat a Server01 számítógépen futott.

  2. A parancsmag AsJob paraméterével Invoke-Command indított feladatok kezeléséhez használja a Feladat parancsmagokat. Mivel a távoli feladatot képviselő feladatobjektum a helyi számítógépen található, nem kell távoli parancsokat futtatnia a feladat kezeléséhez.

    A feladat befejezésének megállapításához használjon egy parancsot Get-Job . A következő parancs lekéri az aktuális munkamenetben elindított összes feladatot.

    Get-Job
    

    Mivel a távoli feladat az aktuális munkamenetben indult el, egy helyi Get-Job parancs kapja meg a feladatot. A feladatobjektum State tulajdonsága azt mutatja, hogy a parancs sikeresen befejeződött.

    SessionId   Name   State      HasMoreData   Location   Command
    ---------   ----   -----      -----------   --------   -------
    1           Job1   Completed  True          Server01   Get-Eventlog system
    
  3. A feladat eredményeinek lekéréséhez használja a Receive-Job parancsmagot. Mivel a feladateredmények automatikusan visszakerülnek arra a számítógépre, ahol a feladatobjektum található, az eredményeket egy helyi Receive-Job paranccsal szerezheti be.

    A következő parancs a Receive-Job parancsmagot használja a feladat eredményeinek lekéréséhez. A munkamenet-azonosítót használja a feladat azonosításához. Ez a parancs menti a feladat eredményeit a $results változóba. Az eredményeket egy fájlba is átirányíthatja.

    $results = Receive-Job -id 1
    

Távoli feladat indítása, amely a távoli számítógépen tárolja az eredményeket

Ha olyan távoli számítógépen szeretne feladatot indítani, amely a parancs eredményeit a távoli számítógépen tárolja, a Invoke-Command parancsmaggal futtasson egy Start-Job parancsot egy távoli számítógépen. Ezzel a módszerrel több számítógépen futtathat feladatokat.

Amikor távolról futtat egy Start-Job parancsot, a feladatobjektum létrejön a távoli számítógépen, és a feladateredmények megmaradnak a távoli számítógépen. A feladat szempontjából minden művelet helyi. Csak távoli parancsokat futtat egy helyi feladat távoli számítógépen való kezeléséhez.

  1. Invoke-Command A parancsmag használatával parancsot Start-Job futtathat egy távoli számítógépen.

    Ehhez a parancshoz PSSession (állandó kapcsolat) szükséges. Ha a ComputerName paraméterét Invoke-Command használja egy ideiglenes kapcsolat létrehozásához, a Invoke-Command parancs a feladatobjektum visszaadásakor befejezettnek minősül. Ennek eredményeképpen az ideiglenes kapcsolat lezárul, és a feladat megszakad.

    A következő parancs a New-PSSession parancsmaggal hoz létre egy PSSessiont, amely a Server01 számítógéphez csatlakozik. A parancs menti a PSSessiont a $s változóban.

    $s = New-PSSession -computername Server01
    

    A következő parancs a Invoke-Command parancsmaggal futtat egy Start-Job parancsot a PSSessionban. A Start-Job parancs és a Get-Eventlog parancs zárójelek közé van kapcsos zárójelek közé zárva.

    Invoke-Command -session $s -scriptblock {
      Start-Job -scriptblock {Get-Eventlog system}}
    

    Az eredmények a következő mintakimenethez hasonlítanak.

    Id       Name    State      HasMoreData     Location   Command
    --       ----    -----      -----------     --------   -------
    2        Job2    Running    True            Localhost  Get-Eventlog system
    

    Ha távolról futtat egy Start-Job parancsot, Invoke-Command ugyanazt a típusú feladatobjektumot adja vissza, amelyet Start-Job visszaad. Mentheti a feladatobjektumot egy változóba, vagy egy Get-Job paranccsal lekérheti a feladatot.

    Vegye figyelembe, hogy a Location (Hely ) tulajdonság értéke azt mutatja, hogy a feladat a helyi számítógépen ,,LocalHost" néven fut, annak ellenére, hogy a feladat a Server01 számítógépen futott. Mivel a feladatobjektum a Server01 számítógépen jön létre, és a feladat ugyanazon a számítógépen fut, helyi háttérfeladatnak minősül.

  2. Távoli feladat kezeléséhez használja a Feladat parancsmagokat. Mivel a feladatobjektum a távoli számítógépen található, távoli parancsokat kell futtatnia a feladat eredményeinek lekéréséhez, leállításához, várakozásához vagy lekéréséhez.

    Annak megtekintéséhez, hogy a feladat befejeződött-e, futtasson egy Invoke-CommandGet-Job parancsot a Server01 számítógéphez csatlakoztatott PSSessionban.

    Invoke-Command -session $s -scriptblock {Get-Job}
    

    A parancs egy feladatobjektumot ad vissza. A feladatobjektum State tulajdonsága azt mutatja, hogy a parancs sikeresen befejeződött.

    SessionId   Name  State      HasMoreData   Location   Command
    ---------   ----  -----      -----------   --------   -------
    2           Job2  Completed  True          LocalHost   Get-Eventlog system
    
  3. A feladat eredményeinek lekéréséhez a Invoke-Command parancsmaggal futtasson egy Receive-Job parancsot a Server01 számítógéphez csatlakoztatott PSSessionban.

    A következő parancs a Receive-Job parancsmagot használja a feladat eredményeinek lekéréséhez. A munkamenet-azonosítót használja a feladat azonosításához. Ez a parancs menti a feladat eredményeit a $results változóba. A Keep paramétert Receive-Job használja az eredmény távoli számítógépen való megőrzéséhez a feladat-gyorsítótárban.

    $results = Invoke-Command -session $s -scriptblock {
      Receive-Job -SessionId 2 -Keep
    }
    

    Az eredményeket átirányíthatja a helyi vagy távoli számítógépen található fájlba is. A következő parancs átirányítási operátorral menti az eredményeket egy fájlba a Server01 számítógépen.

    Invoke-Command -session $s -command {
      Receive-Job -SessionId 2 > c:\logs\pslog.txt
    }
    

Futtatás leválasztott folyamatként

Ahogy korábban említettük, a szülőmunkamenet leállásakor a gyermekfolyamatokkal együtt az összes futó gyermekfeladat leáll. A helyi gépen az aktuális PowerShell-munkamenethez nem kapcsolódó feladatokat futtathat újra.

Hozzon létre egy új PowerShell-munkamenetet a helyi gépen. Invoke-Command Feladat indítása ebben a munkamenetben. Invoke-Command lehetővé teszi a távoli munkamenet leválasztását és a szülőmunkamenet leállítását. Később elindíthat egy új PowerShell-munkamenetet, és csatlakozhat a korábban leválasztott munkamenethez a feladat monitorozásának folytatásához. Az eredeti PowerShell-munkamenetbe visszaküldött adatok azonban elvesznek a munkamenet leállásakor. Az újracsatlakozáskor csak a leválasztást követően létrehozott új adatobjektumok lesznek visszaadva.

# Create remote session on local machine
PS> $session = New-PSSession -cn localhost

# Start remote job
PS> $job = Invoke-Command -Session $session -ScriptBlock { 1..60 | % { sleep 1; "Output $_" } } -AsJob
PS> $job

Id     Name     PSJobTypeName   State         HasMoreData     Location      Command
--     ----     -------------   -----         -----------     --------      -------
1      Job1     RemoteJob       Running       True            localhost     1..60 | % { sleep 1; ...

# Disconnect the job session
PS> Disconnect-PSSession $session

Id Name         Transport ComputerName    ComputerType    State         ConfigurationName     Availability
-- ----         --------- ------------    ------------    -----         -----------------     ------------
1 Runspace1     WSMan     localhost       RemoteMachine   Disconnected  Microsoft.PowerShell          None

PS> $job

Id     Name     PSJobTypeName   State         HasMoreData     Location      Command
--     ----     -------------   -----         -----------     --------      -------
1      Job1     RemoteJob       Disconnected  True            localhost     1..60 | % { sleep 1;

# Reconnect the session to a new job object
PS> $jobNew = Receive-PSSession -Session $session -OutTarget Job
PS> $job | Wait-Job | Receive-Job
Output 9
Output 10
Output 11
...

Ebben a példában a feladatok továbbra is egy szülő PowerShell-munkamenethez vannak csatolva. A szülőmunkamenet azonban nem az eredeti PowerShell-munkamenet, ahol Invoke-Command futtatták.

Lásd még