about_Remote_Jobs

Deskripsi singkat

Menjelaskan cara menjalankan pekerjaan latar belakang pada komputer jarak jauh.

Deskripsi Terperinci

PowerShell secara bersamaan menjalankan perintah dan skrip melalui pekerjaan. Ada tiga jenis pekerjaan yang disediakan oleh PowerShell untuk mendukung konkurensi.

  • RemoteJob - Perintah dan skrip berjalan dalam sesi jarak jauh.
  • BackgroundJob - Perintah dan skrip berjalan dalam proses terpisah pada komputer lokal. Untuk informasi selengkapnya, lihat about_Jobs.
  • PSTaskJob atau ThreadJob - Perintah dan skrip berjalan dalam utas terpisah dalam proses yang sama pada komputer lokal. Untuk informasi selengkapnya, lihat about_Thread_Jobs.

Menjalankan skrip dari jarak jauh, pada komputer terpisah atau dalam proses terpisah, memberikan isolasi yang besar. Kesalahan apa pun yang terjadi dalam pekerjaan jarak jauh tidak memengaruhi pekerjaan lain yang sedang berjalan atau sesi induk yang memulai pekerjaan. Namun, lapisan jarak jauh menambahkan overhead, termasuk serialisasi objek. Semua objek diserialisasikan dan dideserialisasi karena diteruskan antara sesi induk dan sesi jarak jauh (pekerjaan). Serialisasi objek data kompleks yang besar dapat mengonsumsi sumber daya komputasi dan memori dalam jumlah besar dan mentransfer data dalam jumlah besar di seluruh jaringan.

Penting

Sesi induk yang membuat pekerjaan juga memantau status pekerjaan dan mengumpulkan data alur. Proses turunan pekerjaan dihentikan oleh proses induk setelah pekerjaan mencapai status selesai. Jika sesi induk dihentikan, semua pekerjaan turunan yang berjalan dihentikan bersama dengan proses anak mereka.

Ada dua cara untuk mengatasi situasi ini:

  1. Gunakan Invoke-Command untuk membuat pekerjaan yang berjalan dalam sesi terputus. Lihat bagian proses yang dilepas dari artikel ini.
  2. Gunakan Start-Process untuk membuat proses baru daripada pekerjaan. Untuk informasi selengkapnya, lihat Proses Mulai.

Pekerjaan Jarak Jauh

Anda dapat menjalankan pekerjaan di komputer jarak jauh dengan menggunakan tiga metode berbeda.

  • Memulai sesi interaktif pada komputer jarak jauh. Kemudian mulai pekerjaan di sesi interaktif. Prosedurnya sama dengan menjalankan pekerjaan lokal, meskipun semua tindakan dilakukan pada komputer jarak jauh.

  • Jalankan pekerjaan pada komputer jarak jauh yang mengembalikan hasilnya ke komputer lokal. Gunakan metode ini ketika Anda ingin mengumpulkan hasil pekerjaan dan mempertahankannya di lokasi pusat di komputer lokal.

  • Jalankan pekerjaan pada komputer jarak jauh yang mempertahankan hasilnya pada komputer jarak jauh. Gunakan metode ini ketika data pekerjaan lebih aman dipertahankan pada komputer asal.

Memulai pekerjaan dalam sesi interaktif

Anda dapat memulai sesi interaktif dengan komputer jarak jauh lalu memulai pekerjaan selama sesi interaktif. Untuk informasi selengkapnya tentang sesi interaktif, lihat about_Remote, dan lihat Enter-PSSession.

Prosedur untuk memulai pekerjaan dalam sesi interaktif hampir identik dengan prosedur untuk memulai pekerjaan latar belakang di komputer lokal. Namun, semua operasi terjadi pada komputer jarak jauh, bukan komputer lokal.

  1. Enter-PSSession Gunakan cmdlet untuk memulai sesi interaktif dengan komputer jarak jauh. Anda dapat menggunakan parameter ComputerName untuk Enter-PSSession membuat koneksi sementara untuk sesi interaktif. Atau, Anda dapat menggunakan parameter Sesi untuk menjalankan sesi interaktif dalam sesi PowerShell (PSSession).

    Perintah berikut memulai sesi interaktif di komputer Server01.

    C:\PS> Enter-PSSession -computername Server01
    

    Perintah berubah untuk menunjukkan bahwa Anda sekarang tersambung ke komputer Server01.

    Server01\C:>
    
  2. Untuk memulai pekerjaan jarak jauh dalam sesi, gunakan Start-Job cmdlet. Perintah berikut menjalankan pekerjaan jarak jauh yang mendapatkan peristiwa di log peristiwa Windows PowerShell di komputer Server01. Start-Job Cmdlet mengembalikan objek yang mewakili pekerjaan.

    Perintah ini menyimpan objek pekerjaan dalam $job variabel.

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

    Saat pekerjaan berjalan, Anda dapat menggunakan sesi interaktif untuk menjalankan perintah lain, termasuk pekerjaan lain. Namun, Anda harus tetap membuka sesi interaktif hingga pekerjaan selesai. Jika Anda mengakhiri sesi, pekerjaan terganggu, dan hasilnya hilang.

  3. Untuk mengetahui apakah pekerjaan selesai, tampilkan nilai $job variabel, atau gunakan Get-Job cmdlet untuk mendapatkan pekerjaan. Perintah berikut menggunakan Get-Job cmdlet untuk menampilkan pekerjaan.

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

    Output Get-Job menunjukkan bahwa pekerjaan berjalan di komputer "localhost" karena pekerjaan dimulai dan berjalan pada komputer yang sama (dalam hal ini, Server01).

  4. Untuk mendapatkan hasil pekerjaan, gunakan Receive-Job cmdlet . Anda dapat menampilkan hasilnya dalam sesi interaktif atau menyimpannya ke file di komputer jarak jauh. Perintah berikut mendapatkan hasil pekerjaan dalam variabel $job. Perintah menggunakan operator pengalihan (>) untuk menyimpan hasil pekerjaan dalam file PsLog.txt di komputer Server01.

    Server01\C:> Receive-Job $job > c:\logs\PsLog.txt
    
  5. Untuk mengakhiri sesi interaktif, gunakan Exit-PSSession cmdlet. Perintah berubah untuk menunjukkan bahwa Anda kembali ke sesi asli di komputer lokal.

    Server01\C:> Exit-PSSession
    C:\PS>
    
  6. Untuk melihat isi PsLog.txt file pada komputer Server01 kapan saja, mulai sesi interaktif lain, atau jalankan perintah jarak jauh. Jenis perintah ini paling baik dijalankan dalam PSSession (koneksi persisten) jika Anda ingin menggunakan beberapa perintah untuk menyelidiki dan mengelola data dalam PsLog.txt file. Untuk informasi selengkapnya tentang PSSessions, lihat about_PSSessions.

    Perintah berikut menggunakan New-PSSession cmdlet untuk membuat PSSession yang tersambung ke komputer Server01, dan mereka menggunakan Invoke-Command cmdlet untuk menjalankan Get-Content perintah di PSSession untuk melihat konten file.

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

Memulai pekerjaan jarak jauh yang mengembalikan hasil ke komputer lokal (AsJob)

Untuk memulai pekerjaan di komputer jarak jauh yang mengembalikan hasil perintah ke komputer lokal, gunakan parameter AsJob cmdlet seperti Invoke-Command cmdlet.

Ketika Anda menggunakan parameter AsJob , objek pekerjaan sebenarnya dibuat di komputer lokal meskipun pekerjaan berjalan di komputer jarak jauh. Ketika pekerjaan selesai, hasilnya dikembalikan ke komputer lokal.

Anda dapat menggunakan cmdlet yang berisi kata benda Pekerjaan (cmdlet Pekerjaan) untuk mengelola pekerjaan apa pun yang dibuat oleh cmdlet apa pun. Banyak cmdlet yang memiliki parameter AsJob tidak menggunakan jarak jauh PowerShell, sehingga Anda dapat menggunakannya bahkan pada komputer yang tidak dikonfigurasi untuk jarak jauh dan tidak memenuhi persyaratan untuk jarak jauh.

  1. Perintah berikut menggunakan parameter AsJob untuk Invoke-Command memulai pekerjaan di komputer Server01. Pekerjaan menjalankan Get-Eventlog perintah yang mendapatkan peristiwa di log Sistem. Anda dapat menggunakan parameter JobName untuk menetapkan nama tampilan ke pekerjaan.

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

    Hasil perintah menyerupai contoh output berikut.

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

    Saat parameter AsJob digunakan, Invoke-Command mengembalikan jenis objek pekerjaan yang sama yang Start-Job kembali. Anda dapat menyimpan objek pekerjaan dalam variabel, atau Anda dapat menggunakan Get-Job perintah untuk mendapatkan pekerjaan.

    Perhatikan bahwa nilai properti Lokasi menunjukkan bahwa pekerjaan berjalan di komputer Server01.

  2. Untuk mengelola pekerjaan yang dimulai dengan menggunakan parameter AsJob cmdlet Invoke-Command , gunakan cmdlet Pekerjaan. Karena objek pekerjaan yang mewakili pekerjaan jarak jauh ada di komputer lokal, Anda tidak perlu menjalankan perintah jarak jauh untuk mengelola pekerjaan.

    Untuk menentukan apakah pekerjaan selesai, gunakan Get-Job perintah. Perintah berikut mendapatkan semua pekerjaan yang dimulai dalam sesi saat ini.

    Get-Job
    

    Karena pekerjaan jarak jauh dimulai dalam sesi saat ini, perintah lokal Get-Job mendapatkan pekerjaan. Properti Status objek pekerjaan menunjukkan bahwa perintah berhasil diselesaikan.

    SessionId   Name   State      HasMoreData   Location   Command
    ---------   ----   -----      -----------   --------   -------
    1           Job1   Completed  True          Server01   Get-Eventlog system
    
  3. Untuk mendapatkan hasil pekerjaan, gunakan Receive-Job cmdlet . Karena hasil pekerjaan secara otomatis dikembalikan ke komputer tempat objek pekerjaan berada, Anda bisa mendapatkan hasilnya dengan perintah lokal Receive-Job .

    Perintah berikut menggunakan Receive-Job cmdlet untuk mendapatkan hasil pekerjaan. Ini menggunakan ID sesi untuk mengidentifikasi pekerjaan. Perintah ini menyimpan hasil pekerjaan dalam variabel $results. Anda juga dapat mengalihkan hasil ke file.

    $results = Receive-Job -id 1
    

Memulai pekerjaan jarak jauh yang menyimpan hasilnya di komputer jarak jauh

Untuk memulai pekerjaan di komputer jarak jauh yang menyimpan hasil perintah pada komputer jarak jauh, gunakan Invoke-Command cmdlet untuk menjalankan Start-Job perintah pada komputer jarak jauh. Anda dapat menggunakan metode ini untuk menjalankan pekerjaan pada beberapa komputer.

Saat Anda menjalankan Start-Job perintah dari jarak jauh, objek pekerjaan dibuat di komputer jarak jauh, dan hasil pekerjaan dipertahankan di komputer jarak jauh. Dari perspektif pekerjaan, semua operasi bersifat lokal. Anda hanya menjalankan perintah dari jarak jauh untuk mengelola pekerjaan lokal di komputer jarak jauh.

  1. Invoke-Command Gunakan cmdlet untuk menjalankan Start-Job perintah pada komputer jarak jauh.

    Perintah ini memerlukan PSSession (koneksi persisten). Jika Anda menggunakan parameter Invoke-Command ComputerName untuk membuat koneksi sementara, Invoke-Command perintah dianggap selesai saat objek pekerjaan dikembalikan. Akibatnya, koneksi sementara ditutup, dan pekerjaan dibatalkan.

    Perintah berikut menggunakan New-PSSession cmdlet untuk membuat PSSession yang tersambung ke komputer Server01. Perintah menyimpan PSSession dalam $s variabel .

    $s = New-PSSession -computername Server01
    

    Perintah berikutnya menggunakan Invoke-Command cmdlet untuk menjalankan Start-Job perintah di PSSession. Perintah Start-Job dan Get-Eventlog perintah diapit kurung kurawal.

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

    Hasilnya menyerupai contoh output berikut.

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

    Saat Anda menjalankan Start-Job perintah dari jarak jauh, Invoke-Command mengembalikan jenis objek pekerjaan yang sama yang Start-Job dikembalikan. Anda dapat menyimpan objek pekerjaan dalam variabel, atau Anda dapat menggunakan Get-Job perintah untuk mendapatkan pekerjaan.

    Perhatikan bahwa nilai properti Lokasi menunjukkan bahwa pekerjaan berjalan di komputer lokal, yang dikenal sebagai "LocalHost", meskipun pekerjaan berjalan di komputer Server01. Karena objek pekerjaan dibuat pada komputer Server01 dan pekerjaan berjalan pada komputer yang sama, objek tersebut dianggap sebagai pekerjaan latar belakang lokal.

  2. Untuk mengelola pekerjaan jarak jauh, gunakan cmdlet Pekerjaan . Karena objek pekerjaan berada di komputer jarak jauh, Anda perlu menjalankan perintah jarak jauh untuk mendapatkan, menghentikan, menunggu, atau mengambil hasil pekerjaan.

    Untuk melihat apakah pekerjaan selesai, gunakan Invoke-Command perintah untuk menjalankan Get-Job perintah di PSSession yang tersambung ke komputer Server01.

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

    Perintah mengembalikan objek pekerjaan. Properti Status objek pekerjaan menunjukkan bahwa perintah berhasil diselesaikan.

    SessionId   Name  State      HasMoreData   Location   Command
    ---------   ----  -----      -----------   --------   -------
    2           Job2  Completed  True          LocalHost   Get-Eventlog system
    
  3. Untuk mendapatkan hasil pekerjaan, gunakan Invoke-Command cmdlet untuk menjalankan Receive-Job perintah di PSSession yang tersambung ke komputer Server01.

    Perintah berikut menggunakan Receive-Job cmdlet untuk mendapatkan hasil pekerjaan. Ini menggunakan ID sesi untuk mengidentifikasi pekerjaan. Perintah ini menyimpan hasil pekerjaan dalam $results variabel. Ini menggunakan parameter Keep untuk Receive-Job menyimpan hasil dalam cache pekerjaan di komputer jarak jauh.

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

    Anda juga dapat mengalihkan hasil ke file di komputer lokal atau jarak jauh. Perintah berikut menggunakan operator pengalihan untuk menyimpan hasil dalam file di komputer Server01.

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

Cara menjalankan sebagai proses yang dilepas

Seperti yang disebutkan sebelumnya, ketika sesi induk dihentikan, semua pekerjaan turunan yang berjalan dihentikan bersama dengan proses anak mereka. Anda dapat menggunakan jarak jauh pada komputer lokal untuk menjalankan pekerjaan yang tidak dilampirkan ke sesi PowerShell saat ini.

Buat sesi PowerShell baru di komputer lokal. Penggunaan Invoke-Command untuk memulai pekerjaan dalam sesi ini. Invoke-Command memungkinkan Anda memutuskan sambungan sesi jarak jauh dan mengakhiri sesi induk. Nantinya, Anda dapat memulai sesi PowerShell baru dan menyambungkan ke sesi yang sebelumnya terputus untuk melanjutkan pemantauan pekerjaan. Namun, data apa pun yang dikembalikan ke sesi PowerShell asli hilang ketika sesi tersebut dihentikan. Hanya objek data baru yang dihasilkan setelah pemutusan sambungan dikembalikan saat tersambung kembali.

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

Untuk contoh ini, pekerjaan masih dilampirkan ke sesi PowerShell induk. Namun, sesi induk bukan sesi PowerShell asli tempat Invoke-Command dijalankan.

Lihat juga