如何判断 Start-Job 命令启动了哪些进程?
How can I tell what processes are started by a Start-Job command?
我有(继承)一个 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)?显然,这在只用一个作业进行测试时很容易,但在服务器上我可能同时有许多这样的 运行。
为什么我要do/know这个?
我担任新角色,在具有多个计划任务运行 各种脚本的服务器上工作。其中一些调用我的前任选择使用 Start-Job 调用的其他脚本,可能是因为它们可能很长 运行(多个小时)并希望它们并行工作。有时他们似乎卡住了,我想杀了他们,但不想冒险阻止仍然健康的东西。
开始走这条路后,我可能更好奇如何匹配作业和流程,因为我很可能会在不久的将来开始重写其中的一些脚本。
使用 *-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
属性 保存脚本块的内容 is/was 运行.
(Get-Job -Id 2).Command
State
属性 显示作业的当前状态(运行、已完成、失败、已阻止...)。 HasMoreData
属性 表示作业是否具有可以通过 Receive-Job
.
获取的输出
Receive-Job -Id 4
作业可以通过 Stop-Job
, and Remove-Job
从作业列表中删除已终止的作业来停止。
有关后台作业的更多信息,请参阅 here。
据我所知,"can I tell which process matches up with each job"的答案是否。
但是,似乎有一些线索表明哪些进程与作业匹配。
他们有一个命令行,例如:
"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 到 return 作业详细信息,则很容易),您可能能够根据时间戳将作业与进程匹配,但即使在简单的测试中也没有精确匹配;作业和进程在启动时相隔 1-2 秒。
除此之外,我找不到任何有用的方法来识别链接到每个作业的实际流程。
我有(继承)一个 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)?显然,这在只用一个作业进行测试时很容易,但在服务器上我可能同时有许多这样的 运行。
为什么我要do/know这个?
我担任新角色,在具有多个计划任务运行 各种脚本的服务器上工作。其中一些调用我的前任选择使用 Start-Job 调用的其他脚本,可能是因为它们可能很长 运行(多个小时)并希望它们并行工作。有时他们似乎卡住了,我想杀了他们,但不想冒险阻止仍然健康的东西。
开始走这条路后,我可能更好奇如何匹配作业和流程,因为我很可能会在不久的将来开始重写其中的一些脚本。
使用 *-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
属性 保存脚本块的内容 is/was 运行.
(Get-Job -Id 2).Command
State
属性 显示作业的当前状态(运行、已完成、失败、已阻止...)。 HasMoreData
属性 表示作业是否具有可以通过 Receive-Job
.
Receive-Job -Id 4
作业可以通过 Stop-Job
, and Remove-Job
从作业列表中删除已终止的作业来停止。
有关后台作业的更多信息,请参阅 here。
据我所知,"can I tell which process matches up with each job"的答案是否。
但是,似乎有一些线索表明哪些进程与作业匹配。
他们有一个命令行,例如:
"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 到 return 作业详细信息,则很容易),您可能能够根据时间戳将作业与进程匹配,但即使在简单的测试中也没有精确匹配;作业和进程在启动时相隔 1-2 秒。
除此之外,我找不到任何有用的方法来识别链接到每个作业的实际流程。