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

时间:2016-01-25 15:24:48

标签: powershell process jobs powershell-jobs

我已经(继承)了一个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 )?显然,只用一个作业就可以很容易地进行测试,但在服务器上我可能会同时运行许多作业。

为什么我要这样做?

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

在开始这条道路之后,对于如何匹配工作和流程可能更为明白,因为我很可能在不久的将来开始重写其中的一些脚本。

2 个答案:

答案 0 :(得分:3)

使用*-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属性保存作业正在/正在运行的脚本块的内容。

(Get-Job -Id 2).Command

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

Receive-Job -Id 4

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

有关后台作业的详细信息,请参阅here

答案 1 :(得分:1)

据我所知,“我能告诉哪个流程与每项工作相符”的答案是

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

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

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

  2. 它们是另一个 powershell.exe powershell_ise.exe 进程的子进程,具体取决于它们的调用方式。如果父进程由任务管理器或其他调度代理程序调用,则可能的情况是进程命令行中将有一个脚本名称,这可能会有所帮助。在我的情况下,这并不是太多的帮助,因为每个计划的任务都会产生~4个powershell.exe后台进程。

  3. 如果您有关于每个作业何时启动的详细信息(如果您可以运行Get-Job cmdlet以返回作业详细信息,则很容易),您可以根据时间戳将作业与进程匹配,但即使在简单的测试中也没有完全匹配;这个工作和过程在开始时间隔1-2秒。

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