我有一个(继承)一个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 调用的其他脚本,可能是因为它们可以长时间运行(数小时)并希望它们并行工作。偶尔他们似乎被卡住了,我想杀死他们,但不想冒险阻止仍然健康的东西。
沿着这条路开始,对于如何匹配作业和流程,我可能会更加好奇,因为我很可能会在不久的将来开始重写其中一些脚本。
使用 *-Job
cmdlet 可能比摆弄实际进程更好。使用 Get-Job
列出现有作业:
PS C:\> 获取工作ID 名称 PSJobTypeName State HasMoreData Location 命令-- ---- ------------- ----- ----------- -------- -------2 作业2 后台作业运行假本地主机做一些4 作业4 背景作业已完成 真正的本地主机获取其他
Command
属性保存作业正在运行的脚本块的内容。
(Get-Job -Id 2).Command
State
属性显示作业的当前状态(正在运行、已完成、失败、已阻止等)。HasMoreData
属性指示作业是否具有可通过 Receive-Job
获取的输出。
Receive-Job -Id 4
可以通过 Stop-Job
停止作业,Remove-Job
从作业列表中删除已终止的作业。
有关后台作业的详细信息,请参阅此处。
据我所知,"我能知道哪个进程与每个工作匹配"的答案是否定的。
但是,似乎有一些线索可以说明哪些流程与作业匹配。
-
它们有一个命令行,例如:
"C:WindowsSystem32WindowsPowerShellv1.0powershell.exe" -Version 4.0 -s -NoLogo -NoProfile
-
它们是另一个 powershell 或powershell_ise.exe进程的子进程.exe具体取决于它们的调用方式。如果父进程由任务管理器或其他调度代理调用,则进程命令行中很可能有一个脚本名称,这可能会有所帮助。就我而言,这不是太大的帮助,因为每个计划任务都会生成~4个powershell.exe后台进程。
-
如果你有每个作业启动时间的详细信息(如果可以运行
Get-Job
cmdlet 以返回作业详细信息,则很容易),则可以根据时间戳将作业与进程进行匹配,但即使在简单的测试中也没有完全匹配;作业和进程在启动时相隔 1-2 秒。
除此之外,我找不到任何有用的方法来识别与每个工作相关的实际流程。