Aracılığıyla paylaş


about_Jobs

Kısa açıklama

PowerShell arka plan işlerinin geçerli oturumla etkileşim kurmadan arka planda bir komut veya ifadeyi nasıl çalıştıracakları hakkında bilgi sağlar.

Uzun açıklama

PowerShell, komutları ve betikleri işler aracılığıyla eşzamanlı olarak çalıştırır. Eşzamanlılığı desteklemek için PowerShell tarafından sağlanan üç iş türü vardır.

  • RemoteJob - Komutlar ve betikler uzak bir oturumda çalışır. Bilgi için bkz. about_Remote_Jobs.
  • BackgroundJob - Komutlar ve betikler yerel makinede ayrı bir işlemde çalıştırılır.
  • PSTaskJob veya ThreadJob - Komutlar ve betikler, yerel makinede aynı işlem içinde ayrı bir iş parçacığında çalışır. Daha fazla bilgi için bkz. about_Thread_Jobs.

Betikleri uzaktan, ayrı bir makinede veya ayrı bir işlemde çalıştırmak harika yalıtım sağlar. Uzak işte oluşan hatalar, diğer çalışan işleri veya işi başlatan üst oturumu etkilemez. Ancak uzaktan iletişim katmanı, nesne serileştirme de dahil olmak üzere ek yük ekler. Tüm nesneler, üst oturum ile uzak (iş) oturum arasında geçirildikçe seri hale getirilir ve seri durumdan çıkarılır. Büyük karmaşık veri nesnelerinin seri hale getirilmesi büyük miktarda işlem ve bellek kaynağı tüketebilir ve büyük miktarda veriyi ağ üzerinden aktarabilir.

İş parçacığı tabanlı işler, farklı iş parçacıklarında aynı işlemde çalıştırıldığından uzak ve arka plan işleri kadar sağlam değildir. Bir işin işlemi kilitleyen kritik bir hatası varsa, işlemdeki diğer tüm işler sonlandırılır.

Ancak iş parçacığı tabanlı işler daha az ek yük gerektirir. Uzaktan iletişim katmanını veya serileştirmeyi kullanmaz. Sonuç nesneleri geçerli oturumdaki canlı nesnelere başvuru olarak döndürülür. Bu ek yük olmadan, iş parçacığı tabanlı işler daha hızlı çalışır ve diğer iş türlerinden daha az kaynak kullanır.

Önemli

İşi oluşturan üst oturum da iş durumunu izler ve işlem hattı verilerini toplar. İş tamamlanmış duruma ulaştığında, iş alt işlemi üst işlem tarafından sonlandırılır. Üst oturum sonlandırılırsa, çalışan tüm alt işler kendi alt işlemleriyle birlikte sonlandırılır.

Bu durumu geçici olarak gidermenin iki yolu vardır:

  1. bağlantısız oturumlarda çalışan işler oluşturmak için Invoke-Command kullanın. Daha fazla bilgi için bkz. about_Remote_Jobs.
  2. İş yerine yeni bir işlem oluşturmak için Start-Process kullanın. Daha fazla bilgi için bkz. başlangıç-işlem .

İş cmdlet'leri

  • Start-Job - Yerel bilgisayarda bir arka plan işi başlatır.
  • Get-Job - Geçerli oturumda başlatılan arka plan işlerini alır.
  • Receive-Job - Arka plan işlerinin sonuçlarını alır.
  • Stop-Job - Arka plan işini durdurur.
  • Wait-Job - Bir veya tüm işler tamamlanana kadar komut istemini gizler.
  • Remove-Job - Arka plan işini siler.
  • Invoke-Command - AsJob parametresi uzak bilgisayarda bir arka plan işi oluşturur. Invoke-Commanddahil olmak üzere herhangi bir iş komutunu uzaktan çalıştırmak için Start-Job kullanabilirsiniz.

Yerel bilgisayarda bir iş başlatma

Yerel bilgisayarda bir arka plan işi başlatmak için Start-Job cmdlet'ini kullanın.

Start-Job komutu yazmak için, işin çalıştığı komutu küme ayracı içine alın ({}). komutu belirtmek için ScriptBlock parametresini kullanın.

Aşağıdaki komut, yerel bilgisayarda bir Get-Process komutu çalıştıran bir arka plan işi başlatır.

Start-Job -ScriptBlock {Get-Process}

Bir arka plan işi başlattığınızda, işin tamamlanması uzun sürse bile komut istemi hemen döner. İş çalışırken oturumda kesintisiz olarak çalışmaya devam edebilirsiniz.

Start-Job komutu, işi temsil eden bir nesne döndürür. İş nesnesi iş hakkında yararlı bilgiler içerir, ancak iş sonuçlarını içermez.

İş nesnesini bir değişkene kaydedebilir ve arka plan işini yönetmek için diğer İş cmdlet'leriyle kullanabilirsiniz. Aşağıdaki komut bir iş nesnesi başlatır ve sonuçta elde edilen iş nesnesini $job değişkenine kaydeder.

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

PowerShell 6.0'da başlayarak, bir arka plan işi başlatmak için işlem hattının sonundaki arka plan işlecini (&) kullanabilirsiniz. Daha fazla bilgi için bkz. arka plan işleci.

Arka plan işlecinin kullanılması, önceki örnekteki Start-Job cmdlet'ini kullanmaya işlevsel olarak eşdeğerdir.

$job = Get-Process &

İş nesnelerini alma

Get-Job cmdlet'i geçerli oturumda başlatılan arka plan işlerini temsil eden nesneleri döndürür. Parametreler olmadan, Get-Job geçerli oturumda başlatılan tüm işleri döndürür.

Get-Job

İş nesnesi, işin durumunu içerir ve bu da işin tamamlanıp tamamlanmadığını gösterir. Tamamlanmış bir işin durumu Tamamlandı veya Başarısız . bir iş de Engellendi veya Çalıştırılıyor olabilir.

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

İş nesnesini bir değişkene kaydedebilir ve daha sonraki bir komutta işi temsil etmek için kullanabilirsiniz. Aşağıdaki komut, kimliği 1 olan işi alır ve $job değişkenine kaydeder.

$job = Get-Job -Id 1

bir işin sonuçlarını alma

Arka plan işi çalıştırdığınızda sonuçlar hemen görünmez. Arka plan işinin sonuçlarını almak için Receive-Job cmdlet'ini kullanın.

Aşağıdaki örnekte, Receive-Job cmdlet'i $job değişkenindeki iş nesnesini kullanarak işin sonuçlarını alır.

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
...

Bir işin sonuçlarını bir değişkene kaydedebilirsiniz. Aşağıdaki komut, $job değişkenindeki işin sonuçlarını $results değişkenine kaydeder.

$results = Receive-Job -Job $job

Kısmi iş sonuçlarını alma ve tutma

Receive-Job cmdlet'i arka plan işinin sonuçlarını alır. İş tamamlandıysa Receive-Job tüm iş sonuçlarını alır. İş hala çalışıyorsa, Receive-Job şimdiye kadar oluşturulan sonuçları alır. Kalan sonuçları almak için Receive-Job komutları yeniden çalıştırabilirsiniz.

Varsayılan olarak, Receive-Job sonuçları iş sonuçlarının depolandığı önbellekten siler. Receive-Job yeniden çalıştırdığınızda, yalnızca ilk çalıştırmadan sonra gelen yeni sonuçları alırsınız.

Aşağıdaki komutlar, iş tamamlanmadan önce çalıştırılacak Receive-Job komutların sonuçlarını gösterir.

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

döndürülen iş sonuçlarını silmesini önlemek için Receive-Job parametresini kullanın. Aşağıdaki komutlar, Keep parametresini henüz tamamlanmamış bir iş üzerinde kullanmanın etkisini gösterir.

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

Sonuçlar bekleniyor

Tamamlanması uzun süren bir komut çalıştırırsanız, işin ne zaman tamamlandığını belirlemek için iş nesnesinin özelliklerini kullanabilirsiniz. Aşağıdaki komut, geçerli oturumdaki tüm arka plan işlerini almak için Get-Job nesnesini kullanır.

Get-Job

Sonuçlar bir tabloda görünür. İşin durumu Durumu sütununda görünür.

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...

Bu durumda, State özelliği İş 2'nin hala çalıştığını gösterir. İş sonuçlarını şimdi almak için Receive-Job cmdlet'ini kullanırsanız sonuçlar tamamlanmamış olur. Tüm sonuçları almak için cmdlet'ini art arda kullanabilirsiniz Receive-Job . İşin ne zaman tamamleneceğini belirlemek için State özelliğini kullanın.

Komutunu da Receive-Job -Wait kullanabilirsiniz. Bu parametreyi kullandığınızda, iş tamamlanana ve tüm sonuçlar sağlanana kadar cmdlet komut istemini döndürmez.

İşin sonuçlarının herhangi birini veya tümünü beklemek için Wait-Job cmdlet'ini de kullanabilirsiniz. Wait-Job, belirli bir veya daha fazla işi veya tüm işleri beklemenizi sağlar. Aşağıdaki komut, Wait-Job 10 olan bir işi beklemek için cmdlet'ini kullanır.

Wait-Job -Id 10

Sonuç olarak, iş tamamlanana kadar PowerShell istemi gösterilmez.

Önceden belirlenmiş bir süre de bekleyebilirsiniz. Bu komut, beklemeyi 120 saniyeyle sınırlamak için Zaman Aşımı parametresini kullanır. Süre dolduğunda komut istemi geri döner, ancak iş arka planda çalışmaya devam eder.

Wait-Job -Id 10 -Timeout 120

İşi durdurma

Arka plan işini durdurmak için Stop-Job cmdlet'ini kullanın. Aşağıdaki komut, Sistem olay günlüğündeki her girişi almak için bir iş başlatır. İş nesnesini $job değişkenine kaydeder.

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

Aşağıdaki komut işi durdurur. | değişkenindeki işi $jobgöndermek için bir işlem hattı işleci (Stop-Job) kullanır.

$job | Stop-Job

İşi silme

Arka plan işini silmek için Remove-Job cmdlet'ini kullanın. Aşağıdaki komut, $job değişkenindeki işi siler.

Remove-Job -Job $job

Başarısız bir işi araştırma

İşler birçok nedenle başarısız olabilir. iş nesnesi, hatanın nedeni hakkında bilgi içeren bir Reason özelliği içerir.

Aşağıdaki örnek, gerekli kimlik bilgileri olmadan bir iş başlatır.

$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:...

İşin başarısız olmasına neden olan hatayı bulmak için Neden özelliğini inceleyin.

$job.ChildJobs[0].JobStateInfo.Reason

Bu durumda, uzak bilgisayar komutu çalıştırmak için açık kimlik bilgileri gerektirdiğinden iş başarısız oldu. Nedeni özelliği aşağıdaki iletiyi içerir:

Uzak sunucuya bağlanma şu hata iletisiyle başarısız oldu: "Erişim reddedildi".

Ayrıca bakınız