5

Start-Job我有(继承)一个 PowerShell 脚本,该脚本通过使用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 调用的其他脚本,可能是因为它们可以长时间运行(多个小时)并希望它们并行工作。有时它们似乎被卡住了,我想杀死它们,但不想冒险阻止仍然健康的东西。

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

4

2 回答 2

3

*-Job与摆弄实际流程相比,使用cmdlet 可能是一种更好的方法。用于Get-Job列出现有作业:

PS C:\>获取工作

Id 名称 PSJobTypeName 状态 HasMoreData 位置命令
-- ---- ------------- ----- ------------ -------- --------
2 Job2 BackgroundJob 运行 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从作业列表中删除已终止的作业。

有关后台作业的更多信息,请参见此处

于 2016-01-26T00:40:20.430 回答
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. 如果您有每个作业何时开始的详细信息(如果您可以运行Get-Jobcmdlet 以返回作业详细信息,这很容易),您可能能够根据时间戳将作业与进程匹配,但即使在简单的测试中也没有确切的匹配; 作业和流程在启动时相隔 1-2 秒。

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

于 2016-02-01T22:23:56.963 回答