2014-01-17 38 views
2

我在Windows上使用powershell运行sbt。我正试图找出杀死sbt的最佳方法。当我想要这样做的一个例子是,如果我忘记设置我的代理设置。如果我忘记设置它们,sbt通常会在尝试解析每个依赖项时挂起30秒或更长时间。如果存在一堆依赖关系,则需要等待它们全部失败。在Windows PowerShell中杀死sbt

如果这是cygwinbash,我很肯定ctrl+c会工作,但它似乎没有效果在PowerShell中。我也试过ctrl+break似乎给线程转储,但不会停止进程。我可以去任务管理器并搜索这个进程并杀死它,但是我希望有一个更简单的方法,也不总是明白我应该从任务管理器中杀掉哪个进程。

我也试过ctrl+zctrl+d和其他一些似乎没有多大作用的人。我猜这是一个没有通过信号传递的PowerShell问题,但我不确定。

+0

你是如何从Powershell启动它的? – mjolinor

+0

在这种情况下,任务管理器的更好替代方法是Process Explorer:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx使用此功能,您可以看到该进程的完整命令行。 –

+0

为什么我们不能找到sbt.exe或其他什么,并通过$ PID来阻止它? 'Get-Process sbt | ForEach-Object -Process {Stop-Process -Id $ _。ID}'告诉我我们正在谈论的可执行文件的名称。 –

回答

0

您使用的是哪个版本的Powershell?对我而言,Ctrl+C在运行sbt时产生了一个提示Terminate batch job (Y/N)?,当我输入Y时终止了sbt。这与标准终端和ConEmu一起工作,所以很奇怪它不适合你。

由于scala在JVM下运行,因此运行sbt不会导致名为sbt的进程,而是一个名为java的进程。出于这个原因,你必须检查进程的命令行参数,看它是否是sbt。你可以一个命令行属性添加到获取进程的结果:

Update-TypeData -TypeName System.Diagnostics.Process -MemberName CommandLine -MemberType ScriptProperty -ea silent -Value { $id = $this.Id; $result = Get-WmiObject win32_process -Filter "ProcessId = $id"; $result.CommandLine }; 

...这将让您在不同的PowerShell窗口输入以下杀SBT:

ps java | ? commandline -m "sbt" | kill 

另外,您可以在不同的终端中使用Powershell,例如ConEmu(我最喜欢的)或Console2,它可以让您选择在任何给定的终端窗口/选项卡中终止当前正在运行的进程。