如何判断 Start-Job 命令启动了哪些进程?

How can I tell what processes are started by a Start-Job command?

我有(继承)一个 PowerShell 脚本,它通过使用 Start-Job cmdlet 和 -FilePath 参数来调用其他 PowerShell 脚本。例如,我有一个什么都不做的脚本:

Start-Sleep -Seconds 86400

我可以通过作业调用:

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

是否有任何简单可靠的方法来找出与这项工作相关的流程(我相信这将是一个额外的 powershell.exe)?显然,这在只用一个作业进行测试时很容易,但在服务器上我可能同时有许多这样的 运行。

为什么我要do/know这个?

我担任新角色,在具有多个计划任务运行 各种脚本的服务器上工作。其中一些调用我的前任选择使用 Start-Job 调用的其他脚本,可能是因为它们可能很长 运行(多个小时)并希望它们并行工作。有时他们似乎卡住了,我想杀了他们,但不想冒险阻止仍然健康的东西。

开始走这条路后,我可能更好奇如何匹配作业和流程,因为我很可能会在不久的将来开始重写其中的一些脚本。

使用 *-Job cmdlet 可能是比摆弄实际进程更好的方法。使用 Get-Job 列出现有职位:

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

Command 属性 保存脚本块的内容 is/was 运行.

(Get-Job -Id 2).Command

State 属性 显示作业的当前状态(运行、已完成、失败、已阻止...)。 HasMoreData 属性 表示作业是否具有可以通过 Receive-Job.

获取的输出
Receive-Job -Id 4

作业可以通过 Stop-Job, and Remove-Job 从作业列表中删除已终止的作业来停止。

有关后台作业的更多信息,请参阅 here

据我所知,"can I tell which process matches up with each job"的答案是

但是,似乎有一些线索表明哪些进程与作业匹配。

  1. 他们有一个命令行,例如:

    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Version 4.0 -s -NoLogo -NoProfile

  2. 它们是另一个 powershell.exepowershell_ise.exe 进程的子进程,取决于它们是如何被调用的。如果父进程被任务管理器或其他调度代理调用,那么进程命令行中很可能会有一个脚本名称,这可能会有所帮助。在我的例子中,这并没有太大帮助,因为每个计划任务都会生成 ~4 powershell.exe 个后台进程。

  3. 如果您知道每个作业何时开始的详细信息(如果您可以 运行 Get-Job cmdlet 到 return 作业详细信息,则很容易),您可能能够根据时间戳将作业与进程匹配,但即使在简单的测试中也没有精确匹配;作业和进程在启动时相隔 1-2 秒。

除此之外,我找不到任何有用的方法来识别链接到每个作业的实际流程。