我已经(继承)了一个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调用的其他脚本,可能是因为它们可以长时间运行(多个小时)并希望它们并行工作。偶尔他们似乎会被卡住,我想杀死他们,但是不想冒险阻止那些仍然健康的东西。
在开始这条道路之后,对于如何匹配工作和流程可能更为明白,因为我很可能在不久的将来开始重写其中的一些脚本。
答案 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)
据我所知,“我能告诉哪个流程与每项工作相符”的答案是否。
然而,似乎有一些线索表明哪些流程与工作相匹配。
他们有一个命令行,如:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Version 4.0 -s -NoLogo -NoProfile
它们是另一个 powershell.exe 或 powershell_ise.exe 进程的子进程,具体取决于它们的调用方式。如果父进程由任务管理器或其他调度代理程序调用,则可能的情况是进程命令行中将有一个脚本名称,这可能会有所帮助。在我的情况下,这并不是太多的帮助,因为每个计划的任务都会产生~4个powershell.exe后台进程。
如果您有关于每个作业何时启动的详细信息(如果您可以运行Get-Job
cmdlet以返回作业详细信息,则很容易),您可以根据时间戳将作业与进程匹配,但即使在简单的测试中也没有完全匹配;这个工作和过程在开始时间隔1-2秒。
除此之外,我找不到任何有用的方法来识别与每项工作相关的实际流程。