İşler hakkında


Kısa açıklama

PowerShell arka plan işlerinin, geçerli oturumla etkileşime girmeden arka planda bir komutu veya ifadeyi nasıl çalıştırdığına ilişkin bilgi sağlar.

Uzun açıklama

PowerShell, işler aracılığıyla komutları ve komut dosyalarını aynı anda çalıştırır. Eşzamanlılığı desteklemek için PowerShell tarafından sağlanan üç iş türü vardır.

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

Komut dosyalarını uzaktan, ayrı bir makinede veya ayrı bir süreçte çalıştırmak, mükemmel izolasyon sağlar. Uzak işte meydana gelen hatalar, çalışan diğer işleri veya işi başlatan üst oturumu etkilemez. Ancak uzaktan iletişim katmanı, nesne serileştirmesi de dahil olmak üzere ek yük ekler. Tüm nesneler ana oturum ile uzak (iş) oturumu arasında aktarılırken serileştirilir ve seri durumdan çıkarılır. Büyük karmaşık veri nesnelerinin serileştirilmesi, büyük miktarda bilgi işlem ve bellek kaynağı tüketebilir ve ağ üzerinden büyük miktarda veri aktarabilir.

İş parçacığı tabanlı işler, farklı iş parçacıklarında aynı süreçte çalıştıkları için uzak ve arka plan işleri kadar sağlam değildir. Bir işte, süreci çökerten kritik bir hata varsa, süreçteki 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 kullanmazlar. Sonuç nesneleri, geçerli oturumdaki canlı nesnelere referans olarak döndürülür. Bu ek yük olmadan iş parçacığı tabanlı işler diğer iş türlerine göre daha hızlı çalışır ve daha az kaynak kullanır.

Bu önemli

İşi oluşturan üst oturum aynı zamanda iş durumunu izler ve ardışık düzen verilerini toplar. İş bitmiş duruma ulaştığında, iş alt süreci ana süreç tarafından sonlandırılır. Ana oturum sonlandırılırsa çalışan tüm alt işler, alt süreçleriyle birlikte sonlandırılır.

Bu durumu çözmenin iki yolu vardır:

  1. Bağlantısı olmayan oturumlarda çalışan işler oluşturmak için Invoke-Command'ı kullanın. Daha fazla bilgi için bkz. about_Remote_Jobs.
  2. Bir iş yerine yeni bir süreç oluşturmak için İşlemi Başlat'ı kullanın. Daha fazla bilgi için bkz. İşlem Başlatma.

İş 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.
  • İşi Durdur - Bir arka plan işini durdurur.
  • Wait-Job - Bir iş veya tüm işler tamamlanana kadar komut istemini gizler.
  • Remove-Job - Bir arka plan işini siler.
  • Invoke-Command - AsJob parametresi uzak bilgisayarda bir arka plan işi oluşturur. Start-Job da dahil olmak üzere herhangi bir iş komutunu uzaktan çalıştırmak için Invoke-Command'ı kullanabilirsiniz.

Yerel bilgisayarda bir işe nasıl başlanır

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

Bir İşi Başlat komutu yazmak için, işin çalıştığı komutu küme parantezleri ({) içine alın. Komutu belirtmek için ScriptBlock parametresini kullanın.

Aşağıdaki komut, yerel bilgisayarda Get-Process komutunu ç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 geri 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 ardından arka plan işini yönetmek için onu diğer İş cmdlet'leriyle birlikte kullanabilirsiniz. Aşağıdaki komut bir iş nesnesini başlatır ve elde edilen iş nesnesini $job değişkenine kaydeder.

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

PowerShell 6,0'dan başlayarak, bir arka plan işi başlatmak için ardışık düzenin sonunda arka plan operatörünü (&) kullanabilirsiniz. Daha fazla bilgi için bkz. arka plan operatörü.

Arka plan operatörünü kullanmak, işlevsel olarak önceki örnekteki Start-Job cmdlet'ini kullanmaya 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. Get-Job, parametreler olmadan geçerli oturumda başlatılan tüm işleri döndürür.

Get-Job

İş nesnesi işin bitip bitmediğini gösteren işin durumunu içerir. Biten bir işin durumu Tamamlandı veya Başarısız'dır. Bir iş aynı zamanda Engellenmiş veya Çalışıyor olabilir.

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

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

$job = Get-Job -Id 1

Bir işin sonucunu almak

Bir arka plan işini çalıştırdığınızda sonuçlar hemen görünmez. Bir 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 saklama

Receive-Job cmdlet'i bir arka plan işinin sonuçlarını alır. İş tamamlanmışsa Receive-Job tüm iş sonuçlarını alır. İş hala çalışıyorsa, Receive-Job o ana kadar oluşturulan sonuçları alır. Kalan sonuçları almak için Receive-Job komutlarını tekrar çalıştırabilirsiniz.

Varsayılan olarak Receive-Job, sonuçları iş sonuçlarının saklandığı önbellekten siler. Receive-Job'u tekrar ç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ılan Receive-Job komutlarını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

Receive-Job'un döndürülen iş sonuçlarını silmesini önlemek için Sakla parametresini kullanın. Aşağıdaki komutlar, henüz tamamlanmayan bir işte Tut parametresini 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ı bekliyorum

Tamamlanması uzun süren bir komut çalıştırırsanız işin ne zaman tamamlanacağı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 Durum 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 kullanacak olsaydınız sonuçlar eksik olurdu. Tüm sonuçları almak için Receive-Job cmdlet'ini tekrar tekrar kullanabilirsiniz. İşin ne zaman tamamlanacağını belirlemek için Durum özelliğini kullanın.

Ayrıca Receive-Job cmdlet'inin Wait parametresini de kullanabilirsiniz. Bu parametreyi kullandığınızda, iş tamamlanana ve tüm sonuçlar mevcut olana kadar cmdlet komut istemini döndürmez.

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

Wait-Job -ID 10

Sonuç olarak, iş tamamlanana kadar PowerShell istemi bastırılır.

Ayrıca önceden belirlenmiş bir süre 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

Bir işi durdurmak

Bir 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. $job değişkenindeki işi Stop-Job'a göndermek için bir ardışık düzen operatörü (|) kullanır.

$job | Stop-Job

Bir işi silme

Bir 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ırmak

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

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

$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ın komutu çalıştırmak için açık kimlik bilgileri gerektirmesi nedeniyle iş başarısız oldu. Neden özelliği aşağıdaki mesajı içerir:

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

Ayrıca bakınız

  • about_Job_Details
  • about_PSSessions
  • about_Remote
  • about_Remote_Jobs
  • about_Thread_Jobs
  • Invoke-Command
  • Get-Job
  • Receive-Job
  • Remove-Job
  • Start-Job
  • Stop-Job
  • Wait-Job

İlgili makaleler