about_Jobs

Deskripsi singkat

Menyediakan informasi tentang bagaimana pekerjaan latar belakang PowerShell menjalankan perintah atau ekspresi di latar belakang tanpa berinteraksi dengan sesi saat ini.

Deskripsi panjang

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 pada sesi jarak jauh. Untuk informasi, lihat about_Remote_Jobs.
  • BackgroundJob - Perintah dan skrip berjalan dalam proses terpisah pada komputer lokal.
  • 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 saat diteruskan antara sesi induk dan sesi (pekerjaan) jarak jauh. 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.

Pekerjaan berbasis utas tidak sekuat pekerjaan jarak jauh dan latar belakang, karena berjalan dalam proses yang sama pada utas yang berbeda. Jika satu pekerjaan memiliki kesalahan kritis yang merusak proses, maka semua pekerjaan lain dalam proses dihentikan.

Namun, pekerjaan berbasis utas membutuhkan lebih sedikit overhead. Mereka tidak menggunakan lapisan jarak jauh atau serialisasi. Objek hasil dikembalikan sebagai referensi ke objek langsung dalam sesi saat ini. Tanpa overhead ini, pekerjaan berbasis utas berjalan lebih cepat dan menggunakan lebih sedikit sumber daya daripada jenis pekerjaan lainnya.

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. Untuk informasi selengkapnya, lihat about_Remote_Jobs.
  2. Gunakan Start-Process untuk membuat proses baru daripada pekerjaan. Untuk informasi selengkapnya, lihat Proses Mulai.

Cmdlet pekerjaan

  • Start-Job - Memulai pekerjaan latar belakang di komputer lokal.
  • Get-Job - Mendapatkan pekerjaan latar belakang yang dimulai dalam sesi saat ini.
  • Receive-Job - Mendapatkan hasil pekerjaan latar belakang.
  • Stop-Job - Menghentikan pekerjaan latar belakang.
  • Wait-Job - Menekan prompt perintah hingga satu atau semua pekerjaan selesai.
  • Remove-Job - Menghapus pekerjaan latar belakang.
  • Invoke-Command - Parameter AsJob membuat pekerjaan latar belakang di komputer jarak jauh. Anda dapat menggunakan Invoke-Command untuk menjalankan perintah pekerjaan apa pun dari jarak jauh, termasuk Start-Job.

Cara memulai pekerjaan di komputer lokal

Untuk memulai pekerjaan latar belakang di komputer lokal, gunakan cmdlet Start-Job.

Untuk menulis perintah Start-Job, sertakan perintah yang dijalankan pekerjaan dalam kurung kurawal ({}). Gunakan parameter ScriptBlock untuk menentukan perintah .

Perintah berikut memulai pekerjaan latar belakang yang menjalankan perintah Get-Process di komputer lokal.

Start-Job -ScriptBlock {Get-Process}

Saat Anda memulai pekerjaan latar belakang, prompt perintah segera kembali, bahkan jika pekerjaan membutuhkan waktu lama untuk diselesaikan. Anda dapat terus bekerja dalam sesi tanpa gangguan saat pekerjaan berjalan.

Perintah Start-Job mengembalikan objek yang mewakili pekerjaan. Objek pekerjaan berisi informasi yang berguna tentang pekerjaan, tetapi tidak berisi hasil pekerjaan.

Anda dapat menyimpan objek pekerjaan dalam variabel lalu menggunakannya dengan cmdlet Pekerjaan lainnya untuk mengelola pekerjaan latar belakang. Perintah berikut memulai objek pekerjaan dan menyimpan objek pekerjaan yang dihasilkan dalam variabel $job.

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

Dimulai di PowerShell 6.0, Anda dapat menggunakan operator latar belakang (&) di akhir alur untuk memulai pekerjaan latar belakang. Untuk informasi selengkapnya, lihat operator latar belakang .

Menggunakan operator latar belakang secara fungsional setara dengan menggunakan cmdlet Start-Job dalam contoh sebelumnya.

$job = Get-Process &

Mendapatkan objek pekerjaan

cmdlet Get-Job mengembalikan objek yang mewakili pekerjaan latar belakang yang dimulai dalam sesi saat ini. Tanpa parameter, Get-Job mengembalikan semua pekerjaan yang dimulai dalam sesi saat ini.

Get-Job

Objek pekerjaan berisi status pekerjaan, yang menunjukkan apakah pekerjaan telah selesai. Pekerjaan yang sudah selesai memiliki status Selesai atau Gagal. Pekerjaan mungkin juga Diblokir atau Menjalankan.

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

Anda dapat menyimpan objek pekerjaan dalam variabel dan menggunakannya untuk mewakili pekerjaan dalam perintah selanjutnya. Perintah berikut mendapatkan pekerjaan dengan ID 1 dan menyimpannya dalam variabel $job.

$job = Get-Job -Id 1

Mendapatkan hasil pekerjaan

Saat Anda menjalankan pekerjaan latar belakang, hasilnya tidak segera muncul. Untuk mendapatkan hasil pekerjaan latar belakang, gunakan cmdlet Receive-Job.

Contoh berikut, cmdlet Receive-Job mendapatkan hasil pekerjaan menggunakan objek pekerjaan dalam variabel $job.

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

Anda dapat menyimpan hasil pekerjaan dalam variabel. Perintah berikut menyimpan hasil pekerjaan dalam variabel $job ke variabel $results.

$results = Receive-Job -Job $job

Mendapatkan dan menyimpan hasil pekerjaan parsial

cmdlet Receive-Job mendapatkan hasil pekerjaan latar belakang. Jika pekerjaan selesai, Receive-Job mendapatkan semua hasil pekerjaan. Jika pekerjaan masih berjalan, Receive-Job mendapatkan hasil yang telah dihasilkan sejauh ini. Anda dapat menjalankan perintah Receive-Job lagi untuk mendapatkan hasil yang tersisa.

Secara default, Receive-Job menghapus hasil dari cache tempat hasil pekerjaan disimpan. Saat Anda menjalankan Receive-Job lagi, Anda hanya mendapatkan hasil baru yang tiba setelah eksekusi pertama.

Perintah berikut menunjukkan hasil perintah Receive-Job yang dijalankan sebelum pekerjaan selesai.

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

Gunakan parameter Keep untuk mencegah Receive-Job menghapus hasil pekerjaan yang dikembalikan. Perintah berikut menunjukkan efek penggunaan parameter Keep pada pekerjaan yang belum selesai.

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

Menunggu hasilnya

Jika Anda menjalankan perintah yang membutuhkan waktu lama untuk diselesaikan, Anda dapat menggunakan properti objek pekerjaan untuk menentukan kapan pekerjaan selesai. Perintah berikut menggunakan objek Get-Job untuk mendapatkan semua pekerjaan latar belakang dalam sesi saat ini.

Get-Job

Hasilnya muncul dalam tabel. Status pekerjaan muncul di kolom Status.

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

Dalam hal ini, properti Status mengungkapkan bahwa Pekerjaan 2 masih berjalan. Jika Anda menggunakan cmdlet Receive-Job untuk mendapatkan hasil pekerjaan sekarang, hasilnya akan tidak lengkap. Anda dapat menggunakan Receive-Job cmdlet berulang kali untuk mendapatkan semua hasilnya. Gunakan properti Status untuk menentukan kapan pekerjaan selesai.

Anda juga dapat perintah Receive-Job -Wait . Saat Anda menggunakan parameter ini, cmdlet tidak mengembalikan prompt perintah hingga pekerjaan selesai dan semua hasil tersedia.

Anda juga dapat menggunakan cmdlet Wait-Job untuk menunggu salah satu atau semua hasil pekerjaan. Wait-Job memungkinkan Anda menunggu satu atau beberapa pekerjaan tertentu atau untuk semua pekerjaan. Perintah berikut menggunakan cmdlet Wait-Job untuk menunggu pekerjaan dengan Id 10.

Wait-Job -Id 10

Akibatnya, perintah PowerShell ditekan hingga pekerjaan selesai.

Anda juga dapat menunggu periode waktu yang telah ditentukan. Perintah ini menggunakan parameter Batas Waktu untuk membatasi waktu tunggu hingga 120 detik. Ketika waktu kedaluwarsa, prompt perintah kembali, tetapi pekerjaan terus berjalan di latar belakang.

Wait-Job -Id 10 -Timeout 120

Menghentikan pekerjaan

Untuk menghentikan pekerjaan latar belakang, gunakan cmdlet Stop-Job. Perintah berikut memulai pekerjaan untuk mendapatkan setiap entri di log peristiwa Sistem. Ini menyimpan objek pekerjaan dalam variabel $job.

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

Perintah berikut menghentikan pekerjaan. Ini menggunakan operator alur (|) untuk mengirim pekerjaan dalam variabel $job ke Stop-Job.

$job | Stop-Job

Menghapus pekerjaan

Untuk menghapus pekerjaan latar belakang, gunakan cmdlet Remove-Job. Perintah berikut menghapus pekerjaan dalam variabel $job.

Remove-Job -Job $job

Menyelidiki pekerjaan yang gagal

Pekerjaan dapat gagal karena berbagai alasan. objek pekerjaan berisi properti Reason yang berisi informasi tentang penyebab kegagalan.

Contoh berikut memulai pekerjaan tanpa kredensial yang diperlukan.

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

Periksa properti Alasan untuk menemukan kesalahan yang menyebabkan pekerjaan gagal.

$job.ChildJobs[0].JobStateInfo.Reason

Dalam hal ini, pekerjaan gagal karena komputer jarak jauh memerlukan kredensial eksplisit untuk menjalankan perintah. Properti Reason berisi pesan berikut:

Menyambungkan ke server jarak jauh gagal dengan pesan kesalahan berikut: "Akses ditolak".

Lihat juga