我如何知道“启动作业”命令启动了哪些进程?

Cha*_*ynt 5 powershell jobs process powershell-jobs

我已经(继承)了一个PowerShell脚本,该脚本通过使用Start-Jobcmdlet和-FilePath参数调用其他PowerShell脚本来调用它们。例如,我有一个不执行任何操作的脚本:

Start-Sleep -Seconds 86400
Run Code Online (Sandbox Code Playgroud)

我可以通过工作来调用:

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
Run Code Online (Sandbox Code Playgroud)

有没有一种简单可靠的方法来找出与此作业相关的流程(我相信它将是一个额外的powershell.exe)?显然,仅通过一项工作就可以轻松进行测试,但是在服务器上,我可能会同时运行其中的许多工作。

我为什么要这样做/知道这一点?

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

从这条路径开始之后,关于如何匹配工作和流程的问题可能就更加令人好奇,因为我很可能在不久的将来开始重写其中一些脚本。

Cha*_*ynt 1

据我所知,“我能否判断哪个流程与每个作业相匹配”的答案是否定的

然而,似乎有一些线索表明哪些流程与工作相匹配。

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

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

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

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

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