我正在尝试创建一个控制台应用程序,该应用程序挂起的方式是,按下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");
}
}
到目前为止,我已经找到了以下信息:如何使命令提示符挂起,虽然它并没有停止SIGTERM,只是SIGINT。我还尝试在java-jar可执行文件中使用关机挂钩,这也让我可以控制SIGINT,但不能控制SIGTERM。我希望程序在给定SIGTERM时保持运行,以便测试destroy函数。我还在Go中编写了一个程序,它也做了类似的事情,只是出于某种原因(我不知道为什么,但它仍然不能处理来自java代码的SIGTERM信号),它将CTRL BREAK注册为中断:
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关闭应用程序:)谢谢你的任何想法:)
来自Java API文档(我的重点):
公开摘要
终止子进程。此流程对象表示的子流程被强制终止。
在Windows术语中,这意味着它终止了进程——相当于SIGKILL。进程无法检测、防止或推迟终止。
请注意,Windows没有任何等效于SIGTERM的功能。对于GUI应用程序,建议的程序记录在KB178893中。
问题内容: 标头中包含以下行: 这实际上改变了我的python日志记录设置,但是pylint认为这是未使用的导入。我一般不希望删除警告,因此可以忽略这一行吗? 我不介意为此项目准备一个,因此更改配置文件的答案将被接受。 否则,这样的事情也会受到赞赏: 问题答案: Pylint消息控件记录在Pylint手册中: 是否可以在本地禁用特定消息? 是的,此功能已在Pylint 0.11中添加。这可以通过
是否可以使用JavaFX开发一个完整的应用程序,并在iOS、Android或Windows Phone8上运行,而无需编写特定于平台的代码?
问题内容: 如何在Windows上将goroutine的运行委托给另一个非管理员帐户?我看到您可以使用在Linux上执行此操作。我看不到如何使用Windows syscall软件包在Windows上执行此操作。我希望能够在程序运行时设置goroutine在其下运行的帐户。这可能吗? 背景知识:- 我想切换运行goroutine的用户,以便当我使用go-oci8时,可以更改在数据库连接期间传递给Or
问题内容: 是否可以使用JavaFX开发整个应用程序并在iOS,Android或Windows Phone 8上运行它,而无需编写特定于平台的代码? 问题答案: 背景 Invariant的答案是关于如何开始一切以及2014年初嵌入式和移动JavaFX的状态的好资源。但是,此后发生 了很多 变化,偶然发现此线程的用户无法获得更新的信息。 我的大部分观点都与Invariant的答案有关,因此我建议先进
问题的关键是,并非每个使用此应用程序的人都可以访问存储文件,并且必须注释掉以下这些行才能进行gradle同步: 在我们的构建类型中,我们定义了调试中没有签名配置: 问题在于Gradle Syncs与构建类型无关,因此它每次都会检查签名配置(storePassword,keyAlias,keyPassword),除非我注释掉这些行。 有没有更自动化的方法来忽略这些行?
我目前正在开发一个Android版本的iPhone应用程序。