【问题标题】:How to prevent subprocesses from receiving CTRL+C / Control+C / SIGINT如何防止子进程接收到 CTRL+C / Control+C / SIGINT
【发布时间】:2017-01-20 10:43:54
【问题描述】:

我的 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 有类似的东西吗?

【问题讨论】:

    标签: scala jvm subprocess signals sigint


    【解决方案1】:

    由于您启动bash,您可以使用trap 内置命令忽略子进程中的信号。

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

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

    【讨论】:

    • 非常感谢!我什至想过打电话给python 来实现这个?
    • 实际上你可能想看看这个巧妙的技巧来在不同的进程组中运行进程,这样用户 CTRL-C 就不会被分派到你的子进程:stackoverflow.com/a/51256203/926540
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多