Scala 如何防止子进程接收CTRL+;C/控制和#x2B;C/SIGINT

Scala 如何防止子进程接收CTRL+;C/控制和#x2B;C/SIGINT,scala,jvm,subprocess,signals,sigint,Scala,Jvm,Subprocess,Signals,Sigint,我的Scala脚本创建如下子流程: val exitValue = Process(Seq("bash", "-c", command), dir) ! processLogger Signal.handle(new Signal("INT"), this) override def handle(sig: Signal) { log.warn("Ignoring SIGINT (Ctrl+C). Press [Esc] instead.") } 命令为例如“mvn clean p

我的Scala脚本创建如下子流程:

val exitValue = Process(Seq("bash", "-c", command), dir) ! processLogger
Signal.handle(new Signal("INT"), this)

override def handle(sig: Signal)
{
    log.warn("Ignoring SIGINT (Ctrl+C). Press [Esc] instead.")
}
命令为例如“mvn clean package”或用于测试此问题的命令为“sleep 20”

出于某种原因,我的脚本必须截取SIGINT,因为用户的意思可能是“复制”而不是“停止它”(确实时常发生)。我通过添加如下信号处理程序实现了这一点:

val exitValue = Process(Seq("bash", "-c", command), dir) ! processLogger
Signal.handle(new Signal("INT"), this)

override def handle(sig: Signal)
{
    log.warn("Ignoring SIGINT (Ctrl+C). Press [Esc] instead.")
}
但是,当子流程正在运行时,这不起作用,因为CTRL+C使其停止。如何使子流程忽略SIGINT?我找到了Python的解决方案:
Scala也有类似的功能吗?

因为启动了
bash
,所以可以使用
trap
内置命令忽略子进程中的信号

只需预加
trap''SIGINT
(带分号)到
命令

Process(Seq("bash", "-c", "trap '' SIGINT;" + command))

谢谢!我甚至想过调用
python
来实现这一点。实际上,您可能想看看在不同的进程组中运行进程的巧妙技巧,以便用户CTRL-C不会被分派到您的子进程: