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 selengkapnya, 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 Start-Job cmdlet.

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

Perintah berikut memulai pekerjaan latar belakang yang menjalankan Get-Process perintah 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 $job variabel.

$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 Start-Job cmdlet dalam contoh sebelumnya.

$job = Get-Process &

Mendapatkan objek pekerjaan

Get-Job Cmdlet 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 Berjalan.

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 $job variabel.

$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 Receive-Job cmdlet .

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

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 $job variabel ke $results variabel .

$results = Receive-Job -Job $job

Mendapatkan dan menyimpan hasil pekerjaan parsial

Receive-Job Cmdlet 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 Receive-Job perintah lagi untuk mendapatkan hasil yang tersisa.

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

Perintah berikut menunjukkan hasil Receive-Job perintah 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 Get-Job objek 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 Receive-Job cmdlet untuk mendapatkan hasil pekerjaan sekarang, hasilnya tidak akan lengkap. Anda dapat menggunakan Receive-Job cmdlet berulang kali untuk mendapatkan semua hasilnya. Gunakan properti Status untuk menentukan kapan pekerjaan selesai.

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

Anda juga dapat menggunakan Wait-Job cmdlet 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 Wait-Job cmdlet 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 Stop-Job cmdlet. Perintah berikut memulai pekerjaan untuk mendapatkan setiap entri di log peristiwa Sistem. Ini menyimpan objek pekerjaan dalam $job variabel.

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

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

$job | Stop-Job

Menghapus pekerjaan

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

Remove-Job -Job $job

Menyelidiki pekerjaan yang gagal

Pekerjaan dapat gagal karena berbagai alasan. objek pekerjaan berisi properti Alasan 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 Alasan berisi pesan berikut:

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

Lihat juga