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
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 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:
- Gunakan
Invoke-Command
untuk membuat pekerjaan yang berjalan dalam sesi terputus. Untuk informasi selengkapnya, lihat about_Remote_Jobs. - 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 menggunakanInvoke-Command
untuk menjalankan perintah pekerjaan apa pun dari jarak jauh, termasukStart-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 $job
Stop-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:
Menyambungkan ke server jarak jauh gagal dengan pesan kesalahan berikut: "Akses ditolak".