如何防止子进程接收 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))
我的 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))