I have (inherited) a PowerShell script that calls other PowerShell scripts by invoking them with a Start-Job
cmdlet and the -FilePath
parameter. For example, I have a script that does nothing:
Start-Sleep -Seconds 86400
Which I can invoke via a job:
PS> Start-Job -Name "Test Job" -FilePath ".\Wait-AllDay.ps1"
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Test Job BackgroundJob Running True localhost Start-Sleep...
PS> Get-Job -Id 2
State : Running
HasMoreData : True
StatusMessage :
Location : localhost
Command : Start-Sleep -Seconds (60*60*24)
JobStateInfo : Running
Finished : System.Threading.ManualResetEvent
InstanceId : 0c0e2c32-cbc5-4d70-b7cb-28771626cf20
Id : 2
Name : Test Job
ChildJobs : {Job3}
PSBeginTime : 25/01/2016 15:06:22
PSEndTime :
PSJobTypeName : BackgroundJob
Is there any easy & reliable way to find out what process is associated with this job (which I believe will be an additional powershell.exe)? Obviously this is easy in testing with just one job, but on a server I may have many of these running concurrently.
I'm in a new role, working on a server which has multiple scheduled tasks running a variety of scripts. Some of these call other scripts which my predecessor chose to invoke using Start-Job, possibly because they can be long running (multiple hours) and wanted them to work in parallel. Occasionally they seem to get stuck and I'd like to kill them, but don't want to risk stopping something that is still healthy.
Having started down this path, it is probably more plain curiosity as to how to match up jobs and processes, since I'll most likely start rewriting some of these scripts in the near future.
Using the *-Job
cmdlets might be a better approach than fiddling with the actual processes. Use Get-Job
to list existing jobs:
PS C:\> Get-Job Id Name PSJobTypeName State HasMoreData Location Command -- ---- ------------- ----- ----------- -------- ------- 2 Job2 BackgroundJob Running False localhost Do-Some 4 Job4 BackgroundJob Completed True localhost Get-Other
The Command
property holds the content of the scriptblock the job is/was running.
(Get-Job -Id 2).Command
The State
property shows the current state of the job (running, completed, failed, blocked, ...). The HasMoreData
property indcates whether the job has output that you can fetch via Receive-Job
.
Receive-Job -Id 4
Jobs can be stopped via Stop-Job
, and Remove-Job
removes terminated jobs from the job list.
See here for further information about background jobs.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With