是否有可能在Windows

时间:2015-10-09 11:17:37

标签: java windows batch-file process sigterm

我正在尝试创建一个控制台应用程序,该应用程序挂起的方式是按下CTRL + BREAK或向进程发送SIGTERM信号并不终止它[即它一直挂着,没有关闭]。我想测试它继续使用以下Java代码:

public static void main(String[] args) throws IOException {
//Replace APPLICATION PATH HERE with path towards the executable file
Process process = Runtime.getRuntime().exec("APPLICATION PATH HERE");
// this should kill the process
process.destroy();

// if the process is alive, exitValue() will throw exception
try {
  process.exitValue();
  // the process is dead - hasn't survived kill
  System.out.println("WRONG: process died");
} catch (IllegalThreadStateException e) {
  // the process is still running
  // the process is not dead and survived destroy()
  System.out.println("OK: process hanged");
}
}

到目前为止,我已设法找到以下信息: How Can I Make A Command Prompt Hang?,虽然它没有停止SIGTERM,只是SIGINT。 我也尝试在java -jar可执行文件中使用Shutdown Hooks,这也让我可以控制SIGINT,但不能控制SIGTERM。我希望程序在给定SIGTERM时继续运行,以便我测试destroy函数。 我也在Go中编写了一个类似的程序,除了它将CTRL + BREAK注册为中断,出于某种原因[我不知道为什么,但它仍然没有处理来自java的SIGTERM信号码]:

package main

import "fmt"
import "os"
import "os/signal"
import "syscall"
func main() {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGTERM, syscall.SIGINT)

go func() {
    sig := <-sigs
    fmt.Println("TEST!!")
    fmt.Println(sig)
    done <- true
}()
fmt.Println("awaiting signal")
<-done
sigs2 := make(chan os.Signal, 1)
done2 := make(chan bool, 1)
signal.Notify(sigs2, syscall.SIGTERM, syscall.SIGINT)
go func() {
    sig2 := <-sigs2
    fmt.Println("TEST!!")
    fmt.Println(sig2)
    done2 <- true
}()
fmt.Println("awaiting signal 2")
<-done2
}

注意:我仍然希望能够使用SIGKILL信号或窗口中的红色X关闭应用程序:) 感谢您的任何想法:)

1 个答案:

答案 0 :(得分:1)

来自Java API documentation(强调我的):

  

public abstract void destroy()

     

杀死子进程。此Process对象表示的子进程强制终止。

在Windows术语中,这意味着它终止了进程 - 相当于SIGKILL。进程无法检测,阻止或推迟终止。

请注意,Windows没有与SIGTERM等效的内容。对于GUI应用程序,建议的过程记录在KB178893