about_Jobs

Rövid leírás

Információt nyújt arról, hogy a PowerShell háttérfeladatai hogyan futtatnak parancsot vagy kifejezést a háttérben az aktuális munkamenet használata nélkül.

Hosszú 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 munkameneten futnak. További információ: about_Remote_Jobs.
  • BackgroundJob – A parancsok és szkriptek külön folyamaton futnak a helyi gépen.
  • 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 kezdő szülőmunkamenetet. Az újraegyeztetési réteg azonban többletterhelést okoz, beleértve az objektumszerializálást is. Minden objektum szerializálva és deszerializálva lesz, ahogy a szülő munkamenet és a távoli (feladat)munkamenet között kerülnek átadásra. 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 továbbíthat a hálózaton.

A szálalapú feladatok nem olyan robusztusak, mint a távoli és a háttérfeladatok, mivel ugyanabban a folyamatban futnak különböző szálakon. Ha egy feladat kritikus hibát jelez, amely összeomlik a folyamat során, akkor a folyamat összes többi feladata leáll.

A szálalapú feladatok azonban kevesebb többletterhelést igényelnek. Nem használják az átnevezési réteget vagy a szerializálást. Az eredményobjektumok az aktuális munkamenetben élő objektumokra mutató hivatkozásokként jelennek meg. E többletterhelés nélkül a szálalapú feladatok gyorsabban futnak, és kevesebb erőforrást használnak, mint a többi feladattípus.

Fontos

A feladatot létrehozó szülő munkamenet is figyeli a feladat állapotát, és összegyűjti a folyamatadatokat. A feladat gyermekfolyamatát a szülőfolyamat leállítja, amint a feladat befejeződött. 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. Leválasztott munkamenetekben futó feladatok létrehozásához használható Invoke-Command . További információ: about_Remote_Jobs.
  2. Feladat Start-Process helyett új folyamatot hozhat létre. További információ: Start-Process.

A feladatparancsmagok

  • Start-Job – Elindít egy háttérfeladatot egy helyi számítógépen.
  • Get-Job – Lekéri az aktuális munkamenetben elindított háttérfeladatokat.
  • Receive-Job - Lekéri a háttérfeladatok eredményeit.
  • Stop-Job - Leállítja a háttérfeladatot.
  • Wait-Job – Letiltja a parancssort, amíg egy vagy az összes feladat be nem fejeződik.
  • Remove-Job – Háttérfeladat törlése.
  • Invoke-Command – Az AsJob paraméter létrehoz egy háttérfeladatot egy távoli számítógépen. Bármely feladatparancsot távolról is futtathat Invoke-Command , beleértve a Start-Job.

Feladat indítása a helyi számítógépen

Ha háttérfeladatot szeretne elindítani a helyi számítógépen, használja a Start-Job parancsmagot.

Parancs írásához Start-Job csatolja azt a parancsot, amelyet a feladat kapcsos zárójelben ({}) futtat. A parancs megadásához használja a ScriptBlock paramétert.

Az alábbi parancs elindít egy háttérfeladatot, amely egy Get-Process parancsot futtat a helyi számítógépen.

Start-Job -ScriptBlock {Get-Process}

Háttérfeladat indításakor a parancssor azonnal visszatér, még akkor is, ha a feladat végrehajtása hosszabb időt vesz igénybe. A munkamenetben megszakítás nélkül folytathatja a munkát, amíg a feladat fut.

A Start-Job parancs egy, a feladatot jelképező objektumot ad vissza. A feladatobjektum hasznos információkat tartalmaz a feladatról, de nem tartalmazza a feladat eredményeit.

A feladatobjektumot egy változóba mentheti, majd a többi Feladat parancsmaggal együtt kezelheti a háttérfeladatot. Az alábbi parancs elindít egy feladatobjektumot, és menti az eredményként kapott feladatobjektumot a $job változóba.

$job = Start-Job -ScriptBlock {Get-Process}

A PowerShell 6.0-tól kezdve a folyamat végén található háttéroperátor (&) használatával elindíthat egy háttérfeladatot. További információ: háttéroperátor.

A háttér operátor használata funkcionálisan egyenértékű az Start-Job előző példában szereplő parancsmag használatával.

$job = Get-Process &

Feladatobjektumok lekérése

A Get-Job parancsmag olyan objektumokat ad vissza, amelyek az aktuális munkamenetben elindított háttérfeladatokat jelölik. Paraméterek Get-Job nélkül az aktuális munkamenetben elindított összes feladatot adja vissza.

Get-Job

A feladatobjektum tartalmazza a feladat állapotát, amely jelzi, hogy a feladat befejeződött-e. Egy befejezett feladat kész vagy sikertelen állapotú. Előfordulhat, hogy egy feladat le van tiltva vagy fut.

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

A feladatobjektumot mentheti egy változóba, és egy későbbi parancsban is képviselheti a feladatot. Az alábbi parancs lekéri a feladatot az 1- azonosítóval, és menti a $job változóba.

$job = Get-Job -Id 1

Feladat eredményeinek lekérése

Háttérfeladat futtatásakor az eredmények nem jelennek meg azonnal. Egy háttérfeladat eredményeinek lekéréséhez használja a Receive-Job parancsmagot.

Az alábbi példában a Receive-Job parancsmag lekéri a feladat eredményeit a változó feladatobjektumával $job .

Receive-Job -Job $job
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)    Id ProcessName
-------  ------    -----      ----- -----   ------    -- -----------
    103       4    11328       9692    56           1176 audiodg
    804      14    12228      14108   100   101.74  1740 CcmExec
    668       7     2672       6168   104    32.26   488 csrss
...

Egy feladat eredményeit egy változóban mentheti. Az alábbi parancs a változóban lévő $job feladat eredményeit a változóba $results menti.

$results = Receive-Job -Job $job

Részleges feladatok eredményeinek lekérése és megtartása

A Receive-Job parancsmag lekéri egy háttérfeladat eredményeit. Ha a feladat befejeződött, Receive-Job lekéri az összes feladat eredményét. Ha a feladat továbbra is fut, Receive-Job lekéri az eddig létrehozott eredményeket. A fennmaradó eredmények lekéréséhez ismét futtathat Receive-Job parancsokat.

Alapértelmezés szerint törli az eredményeket a gyorsítótárból, Receive-Job ahol a feladat eredményeit tárolja. Amikor újra fut Receive-Job , csak az első futtatás után érkezett új eredmények lesznek.

Az alábbi parancsok a feladat befejezése előtt futtatott parancsok eredményeit Receive-Job mutatják.

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    68       3     2632        664    29     0.36   1388 ccmsetup
   749      22    21468      19940   203   122.13   3644 communicator
   905       7     2980       2628    34   197.97    424 csrss
  1121      25    28408      32940   174   430.14   3048 explorer

A Keep paraméter használatával megakadályozhatja Receive-Job a visszaadott feladateredmények törlését. Az alábbi parancsok azt mutatják be, hogy a Keep paramétert egy még nem befejezett feladatra kell használni.

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec
     68       3     2632        664    29     0.36   1388 ccmsetup
    749      22    21468      19940   203   122.13   3644 communicator
    905       7     2980       2628    34   197.97    424 csrss
   1121      25    28408      32940   174   430.14   3048 explorer

Várakozás az eredményekre

Ha olyan parancsot futtat, amely hosszú időt vesz igénybe, a feladatobjektum tulajdonságaival meghatározhatja, hogy mikor fejeződik be a feladat. Az alábbi parancs az objektumot használja az Get-Job aktuális munkamenet összes háttérfeladatának lekéréséhez.

Get-Job

Az eredmények egy táblázatban jelennek meg. A feladat állapota megjelenik az Állapot oszlopban.

Id Name  PSJobTypeName State    HasMoreData Location  Command
-- ----  ------------- -----    ----------- --------  -------
1  Job1  BackgroundJob Complete True        localhost Get-Process
2  Job2  BackgroundJob Running  True        localhost Get-EventLog -Log ...
3  Job3  BackgroundJob Complete True        localhost dir -Path C:\* -Re...

Ebben az esetben az Állapot tulajdonság azt mutatja, hogy a 2. feladat még fut. Ha most a Receive-Job parancsmaggal szeretné lekérni a feladat eredményeit, az eredmények hiányosak lesznek. A parancsmagot többször is használhatja Receive-Job az összes eredmény lekéréséhez. Az Állapot tulajdonság használatával állapítsa meg, hogy mikor fejeződik be a feladat.

A parancsmag Wait paraméterét Receive-Job is használhatja. Ha ezt a paramétert használja, a parancsmag nem adja vissza a parancssort, amíg a feladat be nem fejeződik, és az összes eredmény elérhetővé válik.

A parancsmaggal Wait-Job is megvárhatja a feladat bármely vagy az összes eredményét. Wait-Job lehetővé teszi, hogy egy vagy több konkrét feladatra vagy az összes feladatra várjon. A következő parancs a Wait-Job parancsmaggal várja meg a 10-ben megadott azonosítójú feladatot.

Wait-Job -ID 10

Ennek eredményeképpen a PowerShell-kérés mindaddig el lesz tiltva, amíg a feladat be nem fejeződik.

Az előre meghatározott időtartamot is megvárhatja. Ez a parancs az Időtúllépés paraméter használatával korlátozza a várakozást 120 másodpercre. Amikor lejár az idő, a parancssor visszatér, de a feladat továbbra is a háttérben fut.

Wait-Job -ID 10 -Timeout 120

Feladat leállítása

Háttérfeladat leállításához használja a Stop-Job parancsmagot. Az alábbi parancs elindít egy feladatot a rendszer eseménynaplójának minden bejegyzésének lekéréséhez. Menti a feladatobjektumot a $job változóba.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

A következő parancs leállítja a feladatot. Egy folyamatkezelővel (|) küldi el a változóban lévő feladatot a $job következőnek Stop-Job: .

$job | Stop-Job

Feladat törlése

Háttérfeladat törléséhez használja a Remove-Job parancsmagot. Az alábbi parancs törli a feladatot a $job változóban.

Remove-Job -Job $job

Sikertelen feladat vizsgálata

A feladatok több okból is meghiúsulhatnak. a feladatobjektum tartalmaz egy Ok tulajdonságot, amely a hiba okával kapcsolatos információkat tartalmaz.

Az alábbi példa egy feladatot indít el a szükséges hitelesítő adatok nélkül.

$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job

Id Name  PSJobTypeName State  HasMoreData  Location  Command
-- ----  ------------- -----  -----------  --------  -------
1  Job1  BackgroundJob Failed False        localhost New-Item -Path HKLM:...

Vizsgálja meg az Ok tulajdonságot, és keresse meg azt a hibát, amely miatt a feladat meghiúsult.

$job.ChildJobs[0].JobStateInfo.Reason

Ebben az esetben a feladat meghiúsult, mert a távoli számítógépen explicit hitelesítő adatokra volt szükség a parancs futtatásához. Az Ok tulajdonság a következő üzenetet tartalmazza:

A távoli kiszolgálóra való Csatlakozás a következő hibaüzenettel meghiúsult: "Hozzáférés megtagadva".

Lásd még