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调用这些脚本,可能是因为它们可能会长时间运行(多个小时),并且希望它们可以并行工作。有时它们似乎被卡住了,我想杀死它们,但不想冒险停止仍然健康的东西。
从这条路径开始之后,关于如何匹配工作和流程的问题可能就更加令人好奇,因为我很可能在不久的将来开始重写其中一些脚本。
据我所知,“我能否判断哪个流程与每个作业相匹配”的答案是否定的。
然而,似乎有一些线索表明哪些流程与工作相匹配。
他们有一个命令行,例如:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Version 4.0 -s -NoLogo -NoProfile
它们是另一个powershell.exe或powershell_ise.exe进程的子进程,具体取决于它们的调用方式。如果父进程由任务管理器或其他调度代理调用,那么进程命令行中可能会有一个脚本名称,这可能会有所帮助。就我而言,这并没有太大帮助,因为每个计划任务都会生成约 4 个 powershell.exe 后台进程。
如果您有每个作业启动时间的详细信息(如果您可以运行 cmdletGet-Job以返回作业详细信息,则很容易),您也许能够根据时间戳将作业与进程进行匹配,但即使在简单的测试中,也没有准确的时间匹配; 作业和进程在启动时相隔 1-2 秒。
除此之外,我找不到任何有用的方法来识别与每个作业相关的实际流程。
| 归档时间: |
|
| 查看次数: |
2573 次 |
| 最近记录: |