Aracılığıyla paylaş


about_Remote_Jobs

Kısa açıklama

Uzak bilgisayarlarda arka plan işlerinin nasıl çalıştırıldığı açıklanır.

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 oturumda çalışır.
  • BackgroundJob - Komutlar ve betikler yerel makinede ayrı bir işlemde çalıştırılır. Daha fazla bilgi için bkz. about_Jobs.
  • 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ş) oturumu arasında geçirildikçe serileştirilir 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.

Ö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. Bu makalenin ayrılmış işlemler bölümüne bakın.
  2. İş yerine yeni bir işlem oluşturmak için Start-Process kullanın. Daha fazla bilgi için bkz. başlangıç-işlem .

Uzak işler

Üç farklı yöntem kullanarak uzak bilgisayarlarda iş çalıştırabilirsiniz.

  • Uzak bilgisayarda etkileşimli bir oturum başlatın. Ardından etkileşimli oturumda bir iş başlatın. Tüm eylemler uzak bilgisayarda gerçekleştirilse de yordamlar yerel bir işi çalıştırmayla aynıdır.

  • Sonuçlarını yerel bilgisayara döndüren uzak bir bilgisayarda bir iş çalıştırın. İşlerin sonuçlarını toplamak ve yerel bilgisayarda merkezi bir konumda tutmak istediğinizde bu yöntemi kullanın.

  • Uzak bilgisayarda, sonuçlarını uzak bilgisayarda tutan bir işi çalıştırın. İş verileri kaynak bilgisayarda daha güvenli bir şekilde korunduğunda bu yöntemi kullanın.

Etkileşimli oturumda iş başlatma

Uzak bir bilgisayarla etkileşimli bir oturum başlatabilir ve ardından etkileşimli oturum sırasında bir iş başlatabilirsiniz. Etkileşimli oturumlar hakkında daha fazla bilgi için bkz. about_Remoteve bkz. Enter-PSSession.

Etkileşimli bir oturumda iş başlatma yordamı, yerel bilgisayarda arka plan işi başlatma yordamıyla neredeyse aynıdır. Ancak, tüm işlemler yerel bilgisayarda değil uzak bilgisayarda gerçekleşir.

  1. Uzak bir bilgisayarla etkileşimli bir oturum başlatmak için Enter-PSSession cmdlet'ini kullanın. Etkileşimli oturum için geçici bir bağlantı kurmak üzere Enter-PSSession ComputerName parametresini kullanabilirsiniz. Alternatif olarak, etkileşimli oturumu bir PowerShell oturumunda (PSSession) çalıştırmak için Session parametresini de kullanabilirsiniz.

    Aşağıdaki komut, Server01 bilgisayarında etkileşimli bir oturum başlatır.

    C:\PS> Enter-PSSession -ComputerName Server01
    

    Komut istemi, artık Server01 bilgisayarına bağlı olduğunuzu gösterecek şekilde değişir.

    Server01\C:>
    
  2. Oturumda uzak bir iş başlatmak için Start-Job cmdlet'ini kullanın. Aşağıdaki komut, Server01 bilgisayarındaki Windows PowerShell olay günlüğündeki olayları alan uzak bir iş çalıştırır. Start-Job cmdlet'i, işi temsil eden bir nesne döndürür.

    Bu komut, iş nesnesini $job değişkenine kaydeder.

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

    İş çalışırken, diğer işler de dahil olmak üzere diğer komutları çalıştırmak için etkileşimli oturumu kullanabilirsiniz. Ancak, iş tamamlanana kadar etkileşimli oturumu açık tutmanız gerekir. Oturumu sona erdirdiğinizde iş kesintiye uğrar ve sonuçlar kaybolur.

  3. İşin tamam olup olmadığını öğrenmek için $job değişkeninin değerini görüntüleyin veya işi almak için Get-Job cmdlet'ini kullanın. Aşağıdaki komut, işi görüntülemek için Get-Job cmdlet'ini kullanır.

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

    Get-Job çıktısı, işin "localhost" bilgisayarda çalıştığını çünkü işin aynı bilgisayarda (bu örnekte Server01) başlatıldığını ve çalıştığını gösterir.

  4. İşin sonuçlarını almak için Receive-Job cmdlet'ini kullanın. Sonuçları etkileşimli oturumda görüntüleyebilir veya uzak bilgisayardaki bir dosyaya kaydedebilirsiniz. Aşağıdaki komut, $job değişkenindeki işin sonuçlarını alır. Komut, işin sonuçlarını Server01 bilgisayarındaki PsLog.txt dosyasına kaydetmek için yeniden yönlendirme işlecini (>) kullanır.

    Server01\C:> Receive-Job $job > C:\logs\PsLog.txt
    
  5. Etkileşimli oturumu sonlandırmak için Exit-PSSession cmdlet'ini kullanın. Komut istemi, yerel bilgisayarda özgün oturumda olduğunuzu gösterecek şekilde değişir.

    Server01\C:> Exit-PSSession
    C:\PS>
    
  6. Server01 bilgisayarında PsLog.txt dosyasının içeriğini istediğiniz zaman görüntülemek için başka bir etkileşimli oturum başlatın veya uzak bir komut çalıştırın. Bu tür komutlar, PsLog.txt dosyasındaki verileri araştırmak ve yönetmek için çeşitli komutlar kullanmak istemeniz durumunda en iyi şekilde PSSession'da (kalıcı bir bağlantı) çalıştırılır. PSSessions hakkında daha fazla bilgi için bkz. about_PSSessions.

    Aşağıdaki komutlar, Server01 bilgisayarına bağlı bir New-PSSession oluşturmak için cmdlet'ini kullanır ve dosyanın içeriğini görüntülemek üzere PSSession'da bir Invoke-Command komutu çalıştırmak için Get-Content cmdlet'ini kullanır.

    $s = New-PSSession -ComputerName Server01
    Invoke-Command -Session $s -ScriptBlock {
      Get-Content C:\logs\pslog.txt}
    

Sonuçları yerel bilgisayara döndüren uzak bir iş başlatma (AsJob)

Komut sonuçlarını yerel bilgisayara döndüren uzak bir bilgisayarda iş başlatmak için, cmdlet'i gibi bir cmdlet'in Invoke-Command parametresini kullanın.

AsJob parametresini kullandığınızda, iş uzak bilgisayarda çalıştırılıyor olsa bile iş nesnesi aslında yerel bilgisayarda oluşturulur. İş tamamlandığında sonuçlar yerel bilgisayara döndürülür.

Herhangi bir cmdlet tarafından oluşturulan herhangi bir işi yönetmek için İş adlarını (İş cmdlet'leri) içeren cmdlet'leri kullanabilirsiniz. AsJob parametrelerine sahip cmdlet'lerin çoğu PowerShell uzaktan iletişimini kullanmaz, bu nedenle uzaktan iletişim için yapılandırılmamış ve uzaktan iletişim gereksinimlerini karşılamayan bilgisayarlarda bile kullanabilirsiniz.

  1. Aşağıdaki komut, Server01 bilgisayarında bir iş başlatmak için Invoke-Command parametresini kullanır. İş, Olayları Sistem günlüğünde alan bir Get-Eventlog komutu çalıştırır. jobName parametresini kullanarak işe bir görünen ad atayabilirsiniz.

    Invoke-Command -ComputerName Server01 -ScriptBlock {
      Get-EventLog System} -AsJob
    

    Komutun sonuçları aşağıdaki örnek çıkışa benzer.

    SessionId   Name   State    HasMoreData   Location   Command
    ---------   ----   -----    -----------   --------   -------
    1           Job1   Running  True          Server01   Get-EventLog System
    

    AsJob parametresi kullanıldığında, Invoke-CommandStart-Job döndürdüğü aynı iş nesnesi türünü döndürür. İş nesnesini bir değişkene kaydedebilir veya işi almak için bir Get-Job komutu kullanabilirsiniz.

    Location özelliğinin değerinin işin Server01 bilgisayarında çalıştığını gösterdiğini unutmayın.

  2. cmdlet'in Invoke-Command parametresini kullanarak başlatılan bir işi yönetmek için İş cmdlet'lerini kullanın. Uzak işi temsil eden iş nesnesi yerel bilgisayarda olduğundan, işi yönetmek için uzak komutları çalıştırmanız gerekmez.

    İşin tamamlanıp tamamlanmadığını belirlemek için bir Get-Job komutu kullanın. Aşağıdaki komut geçerli oturumda başlatılan tüm işleri alır.

    Get-Job
    

    Uzak iş geçerli oturumda başlatıldığından, yerel bir Get-Job komutu işi alır. İş nesnesinin State özelliği komutun başarıyla tamamlandığını gösterir.

    SessionId   Name   State      HasMoreData   Location   Command
    ---------   ----   -----      -----------   --------   -------
    1           Job1   Completed  True          Server01   Get-EventLog System
    
  3. İşin sonuçlarını almak için Receive-Job cmdlet'ini kullanın. İş sonuçları, iş nesnesinin bulunduğu bilgisayara otomatik olarak döndürüldüğünden, sonuçları yerel bir Receive-Job komutuyla alabilirsiniz.

    Aşağıdaki komut, işin sonuçlarını almak için Receive-Job cmdlet'ini kullanır. İşi tanımlamak için oturum kimliğini kullanır. Bu komut, iş sonuçlarını $results değişkenine kaydeder. Sonuçları bir dosyaya da yönlendirebilirsiniz.

    $results = Receive-Job -Id 1
    

Sonuçları uzak bilgisayarda tutan bir uzak iş başlatma

Uzak bilgisayarda komut sonuçlarını saklayan bir işi başlatmak için, uzak bilgisayarda Invoke-Command komutu çalıştırmak için Start-Job cmdlet'ini kullanın. Birden çok bilgisayarda iş çalıştırmak için bu yöntemi kullanabilirsiniz.

Uzaktan bir Start-Job komutu çalıştırdığınızda, uzak bilgisayarda iş nesnesi oluşturulur ve iş sonuçları uzak bilgisayarda tutulur. İşin perspektifinden bakıldığında, tüm işlemler yereldir. Uzak bilgisayardaki yerel bir işi yönetmek için komutları uzaktan çalıştıracaksınız.

  1. uzak bilgisayarda Invoke-Command komutu çalıştırmak için Start-Job cmdlet'ini kullanın.

    Bu komut pssession (kalıcı bir bağlantı) gerektirir. Geçici bağlantı kurmak için Invoke-Command ComputerName parametresini kullanırsanız, iş nesnesi döndürüldüğünde Invoke-Command komutu tamamlanmış olarak kabul edilir. Sonuç olarak, geçici bağlantı kapatılır ve iş iptal edilir.

    Aşağıdaki komut, Server01 bilgisayarına bağlı bir PSSession oluşturmak için New-PSSession cmdlet'ini kullanır. komutu PSSession'ı $s değişkenine kaydeder.

    $s = New-PSSession -ComputerName Server01
    

    Sonraki komut, PSSession'da bir Invoke-Command komutu çalıştırmak için Start-Job cmdlet'ini kullanır. Start-Job komutu ve Get-Eventlog komutu ayraç içine alınır.

    Invoke-Command -Session $s -ScriptBlock {
      Start-Job -ScriptBlock {Get-EventLog System}}
    

    Sonuçlar aşağıdaki örnek çıktıya benzer.

    Id       Name    State      HasMoreData     Location   Command
    --       ----    -----      -----------     --------   -------
    2        Job2    Running    True            Localhost  Get-EventLog System
    

    Start-Job komutunu uzaktan çalıştırdığınızda Invoke-Command, Start-Job döndürdüğü iş nesnesinin türünü döndürür. İş nesnesini bir değişkene kaydedebilir veya işi almak için bir Get-Job komutu kullanabilirsiniz.

    Konum özelliğinin değerinin, işin Server01 bilgisayarında çalıştırılsa bile işin "LocalHost" olarak bilinen yerel bilgisayarda çalıştığını gösterdiğini unutmayın. İş nesnesi Server01 bilgisayarında oluşturulduğundan ve iş aynı bilgisayarda çalıştığından, yerel bir arka plan işi olarak kabul edilir.

  2. Uzak işi yönetmek için İşi cmdlet'lerini kullanın. İş nesnesi uzak bilgisayarda olduğundan, iş sonuçlarını almak, durdurmak, beklemek veya almak için uzak komutları çalıştırmanız gerekir.

    İşin tamamlandığını görmek için Invoke-Command komutunu kullanarak Server01 bilgisayarına bağlı PSSession'da bir Get-Job komutu çalıştırın.

    Invoke-Command -Session $s -ScriptBlock {Get-Job}
    

    komutu bir iş nesnesi döndürür. İş nesnesinin State özelliği komutun başarıyla tamamlandığını gösterir.

    SessionId   Name  State      HasMoreData   Location   Command
    ---------   ----  -----      -----------   --------   -------
    2           Job2  Completed  True          LocalHost   Get-EventLog System
    
  3. İşin sonuçlarını almak için Invoke-Command cmdlet'ini kullanarak Server01 bilgisayarına bağlı PSSession'da bir Receive-Job komutu çalıştırın.

    Aşağıdaki komut, işin sonuçlarını almak için Receive-Job cmdlet'ini kullanır. İşi tanımlamak için oturum kimliğini kullanır. Bu komut, iş sonuçlarını $results değişkenine kaydeder. Uzak bilgisayardaki iş önbelleğinde sonucu tutmak için Receive-Job Keep parametresini kullanır.

    $results = Invoke-Command -Session $s -ScriptBlock {
      Receive-Job -SessionId 2 -Keep
    }
    

    Ayrıca sonuçları yerel veya uzak bilgisayardaki bir dosyaya yeniden yönlendirebilirsiniz. Aşağıdaki komut, sonuçları Server01 bilgisayarındaki bir dosyaya kaydetmek için yeniden yönlendirme işlecini kullanır.

    Invoke-Command -Session $s -Command {
      Receive-Job -SessionId 2 > C:\logs\pslog.txt
    }
    

Ayrılmış işlem olarak çalıştırma

Daha önce belirtildiği gibi, üst oturum sonlandırıldığında, çalışan tüm alt işler kendi alt işlemleriyle birlikte sonlandırılır. Geçerli PowerShell oturumuna bağlı olmayan işleri çalıştırmak için yerel makinede uzaktan iletişim özelliğini kullanabilirsiniz.

Yerel makinede yeni bir PowerShell oturumu oluşturun. Bu oturumda bir iş başlatmak için Invoke-Command kullanma. Invoke-Command uzak oturumun bağlantısını kesmenize ve üst oturumu sonlandırmanıza olanak tanır. Daha sonra yeni bir PowerShell oturumu başlatabilir ve işi izlemeye devam etmek için daha önce bağlantısı kesilmiş olan oturuma bağlanabilirsiniz. Ancak, özgün PowerShell oturumuna döndürülen tüm veriler, bu oturum sonlandırıldığında kaybolur. Yalnızca bağlantı kesildikten sonra oluşturulan yeni veri nesneleri yeniden bağlandığında döndürülür.

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

Bu örnekte işler yine de bir üst PowerShell oturumuna eklenmiştir. Ancak üst oturum, Invoke-Command çalıştırıldığı özgün PowerShell oturumu değildir.

Ayrıca bakınız