当从命令行(通过Ctrl + c)或使用kill命令终止cron进程时,是否可以调用函数?
我试过了register_shutdown_function(),但是当脚本被杀死时似乎没有被调用,但是当脚本正常结束时会被调用.
我试图将结果记录到一个文件,并在cron实例被自动终止时更新数据库值(即运行时间太长).
当我按ctrl- c在控制台中按应用程序线程停止的顺序和关闭挂钩调用?
我在Java中有一个相当复杂的关闭 - 有很多清理工作要做.特别是我试图找出如何从关闭钩子线程错误处理.我的代码目前包括:
try {
return shutdownPromise = doShutdown();
}
catch (Throwable exc) {
logger.error("An exception was thrown while shutting down the application.", exc);
System.exit(1);
return null;
}
Run Code Online (Sandbox Code Playgroud)
当我最初写这篇文章时,我基本上认为,关机时的错误应该直接进行exit.但是exit水平不是那么低; 它调用了shutdown hooks.
所以我认为 -
在IntelliJ中调试注册关闭挂钩的应用程序时,如果单击绿色的"重新启动"圆形箭头按钮,则不会调用关闭挂钩,也不会单击红色方块"停止"按钮.在这两种情况下,看起来app-under-debug都会被立即强行终止.
(注意这不是重复的如何停止在intelliJ中运行的处理,以便它调用关闭钩子?)
当我"手动"向调试器进程发送来自Mac终端的INT信号时,我的关机挂钩当然会按预期运行.但我无法在IDE中发现任何引发所需行为的配置设置或控件.
可以通过配置禁用log4j2中的关闭挂钩:
<Configuration shutdownHook="disable">
Run Code Online (Sandbox Code Playgroud)
有可能以编程方式这样做吗?
我试图在我的ubuntu服务器上运行一个关闭钩子,但是我似乎遇到了多个线程的问题.使用基本的ShutdownHook,当我使用kill进程时,下面的代码可以正常工作kill <PID>,这意味着关闭行为被激活.
public static void main(String[] args) {
ShutdownHook shutDown = new ShutdownHook();
shutDown.attachShutDownHook();
while(true){}
}
Run Code Online (Sandbox Code Playgroud)
但是这个带有附加线程的相同代码却没有
public static void main(String[] args) {
ShutdownHook shutDown = new ShutdownHook();
shutDown.attachShutDownHook();
(new Thread() {
public void run() {
while ( true ) {}
}
}).start();
while(true){}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
class ShutdownHook {
ShutdownHook() {
}
public void attachShutDownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Shut down hook activating");
}
});
System.out.println("Shut Down Hook Attached.");
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个专门的记录器类,它使用java.util.logging.Logger该类.我希望能够在另一个类的关闭钩子中使用此记录器.但是,它似乎不会在关机时登录.根据我的阅读,可能已经为记录器本身激活了一个关闭钩子,这导致了问题.
我怎样才能让它发挥作用?理想情况下,我希望在日志文件中看到我实际上在进程终止时执行了shutdown钩子.
我有一些临时文件,我打电话deleteOnExit()给.我也有一个可以运行的runnable,addShutdownHook()可以在System.exit调用时运行.
我的关机挂钩运行时是否保证临时文件仍然可用?
我需要根据我的应用程序结果修改JVM返回码.
但是显式调用System.exit(代码)是有风险的,因为应用程序很复杂,很难识别运行线程的结束.
所以我想出了在JVM退出之前使用shutdown hook修改返回代码.
但是有一个问题是如何获得JVM的原始返回码,因为它可能是错误代码而不是0.
Spring Boot 有没有办法控制应用程序的正常关闭?
我知道您可以@PreDestroy在 bean 中拥有方法,但是如何控制这些@PreDestroy方法的调用顺序?
您可以拥有多个相互依赖的 bean,上下文的关闭是否已经查找此依赖项并@PreDestroy以正确的顺序调用方法?
例如,我想要完成的是:
1)停止在休息端点上侦听新请求
2)防止兔子消息侦听器接受新消息
3)等待在关闭之前已开始但尚未完成的所有处理。
shutdown-hook ×10
java ×7
shutdown ×3
console ×1
debugging ×1
intellij-13 ×1
java-io ×1
log4j2 ×1
logging ×1
php ×1
spring-boot ×1