如何防止子进程接收 CTRL+C / Control+C / SIGINT

How to prevent subprocesses from receiving CTRL+C / Control+C / SIGINT

我的 Scala 脚本创建这样的子进程:

val exitValue = Process(Seq("bash", "-c", command), dir) ! processLogger

例如命令是"mvn clean package" 或用于测试此问题 "sleep 20"

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

Signal.handle(new Signal("INT"), this)

override def handle(sig: Signal)
{
    log.warn("Ignoring SIGINT (Ctrl+C). Press [Esc] instead.")
}

然而,当子进程为 运行 时,这将不起作用,因为 CTRL+C 会使它停止。我该怎么做才能让子进程忽略 SIGINT?我找到了 Python 的解决方案: Python: How to prevent subprocesses from receiving CTRL-C / Control-C / SIGINT Scala 有类似的东西吗?

自启动 bash 以来,您可以使用 trap built-in 命令忽略子进程中的信号。

只需将 trap '' SIGINT;(带分号)添加到 command:

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