如何防止 SIGINT 信号杀死 Java 中的子进程
How to prevent SIGINT signal kills sub processes in Java
我正在使用 Java exec 到 运行 bash 脚本,但是当我输入 CTRL+C 时,Java 进程和子进程都会退出,如何在 JVM 关闭后保留子进程 运行ning?
String command = "ffmpeg -re -strict -2 -i video.mp4 -c:v copy -an -f rtp rtp://127.0.0.1:1234";
Utils.writeToFile("sub.sh", command);
new ProcessBuilder("parent.sh", "sub.sh").inheritIO()
.start().waitFor();
parent.sh:
#!/bin/bash
trap '' SIGINT SIGTERM SIGQUIT SIGHUP SIGTSTP
nohup "$@" &
我已经阅读了类似问题的答案 here and ,例如,使用 nohup 在该脚本 运行 命令中启动父 bash 脚本,或使用 trap 命令来阻止信号,
根据我的研究,它适用于例如 "tail -f somefile",但不适用于我的用例
"ffmpeg -params",求助,谢谢
TL;DR
在 parent.sh
:
中使用 setsid
而不是 nohup
#!/bin/bash
setsid $@ &
第一个问题是,当您的 Java 程序收到一个 SIGTERM
信号时(在 CTRL + C
之后),JVM 向子进程发送一个 SIGKILL
信号,这不会被捕获、阻止或忽略。因此,一旦您的 parent.sh
进程收到 SIGKILL
,它就会被传递给它的子进程 sub.sh
,从而停止该进程。
第二个问题是 nohup "$@" &
你让你的 sub.sh
子程序 运行 在后台,但它并没有完全脱离当前终端。 nohup
所做的基本上是忽略 SIGHUP
信号。它正常执行进程(在后台)并且实际上不提供守护进程。
您可以使用 setsid 而不是 nohup
,它通过创建一个新会话分离子进程 sub.sh
,然后它将没有控制终端,因此不会收到 SIGKILL
信号。
另一种方法 可以使用 disown
,如 source $@ & disown
,但在这种情况下,它不会阻止当前终端其中parent.sh
是运行ning。问题是,您无法知道子进程何时完成。因此,您将有更多工作要做,以便监视子进程 ID。
补充说明:
我正在使用 Java exec 到 运行 bash 脚本,但是当我输入 CTRL+C 时,Java 进程和子进程都会退出,如何在 JVM 关闭后保留子进程 运行ning?
String command = "ffmpeg -re -strict -2 -i video.mp4 -c:v copy -an -f rtp rtp://127.0.0.1:1234";
Utils.writeToFile("sub.sh", command);
new ProcessBuilder("parent.sh", "sub.sh").inheritIO()
.start().waitFor();
parent.sh:
#!/bin/bash
trap '' SIGINT SIGTERM SIGQUIT SIGHUP SIGTSTP
nohup "$@" &
我已经阅读了类似问题的答案 here and
TL;DR
在 parent.sh
:
setsid
而不是 nohup
#!/bin/bash
setsid $@ &
第一个问题是,当您的 Java 程序收到一个 SIGTERM
信号时(在 CTRL + C
之后),JVM 向子进程发送一个 SIGKILL
信号,这不会被捕获、阻止或忽略。因此,一旦您的 parent.sh
进程收到 SIGKILL
,它就会被传递给它的子进程 sub.sh
,从而停止该进程。
第二个问题是 nohup "$@" &
你让你的 sub.sh
子程序 运行 在后台,但它并没有完全脱离当前终端。 nohup
所做的基本上是忽略 SIGHUP
信号。它正常执行进程(在后台)并且实际上不提供守护进程。
您可以使用 setsid 而不是 nohup
,它通过创建一个新会话分离子进程 sub.sh
,然后它将没有控制终端,因此不会收到 SIGKILL
信号。
另一种方法 可以使用 disown
,如 source $@ & disown
,但在这种情况下,它不会阻止当前终端其中parent.sh
是运行ning。问题是,您无法知道子进程何时完成。因此,您将有更多工作要做,以便监视子进程 ID。
补充说明: