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
atauThreadJob
- 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:
- Gunakan
Invoke-Command
untuk membuat pekerjaan yang berjalan dalam sesi terputus. Lihat bagian proses yang dilepas dari artikel ini. - 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.
Enter-PSSession
Gunakan cmdlet untuk memulai sesi interaktif dengan komputer jarak jauh. Anda dapat menggunakan parameter ComputerName untukEnter-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:>
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.
Untuk mengetahui apakah pekerjaan selesai, tampilkan nilai
$job
variabel, atau gunakanGet-Job
cmdlet untuk mendapatkan pekerjaan. Perintah berikut menggunakanGet-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).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
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>
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 dalamPsLog.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 menggunakanInvoke-Command
cmdlet untuk menjalankanGet-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.
Perintah berikut menggunakan parameter AsJob untuk
Invoke-Command
memulai pekerjaan di komputer Server01. Pekerjaan menjalankanGet-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 yangStart-Job
kembali. Anda dapat menyimpan objek pekerjaan dalam variabel, atau Anda dapat menggunakanGet-Job
perintah untuk mendapatkan pekerjaan.Perhatikan bahwa nilai properti Lokasi menunjukkan bahwa pekerjaan berjalan di komputer Server01.
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
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 lokalReceive-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.
Invoke-Command
Gunakan cmdlet untuk menjalankanStart-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 menjalankanStart-Job
perintah di PSSession. PerintahStart-Job
danGet-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 yangStart-Job
dikembalikan. Anda dapat menyimpan objek pekerjaan dalam variabel, atau Anda dapat menggunakanGet-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.
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 menjalankanGet-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
Untuk mendapatkan hasil pekerjaan, gunakan
Invoke-Command
cmdlet untuk menjalankanReceive-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 untukReceive-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.