【问题标题】:How to terminate a Process before exiting?如何在退出之前终止进程?
【发布时间】:2019-01-06 19:02:28
【问题描述】:

我是 Swift 新手,所以要了解我正在尝试创建一个命令行工具,在代码中我使用 Process 运行节点服务器。这里的问题是,当我退出程序时,节点进程仍在运行,我想在退出程序或即将退出程序时结束它。

import Foundation

let port = "3030"

let process = Process.launchedProcess(launchPath: "/usr/local/bin/node", arguments: ["/path/to/file/index.js"])
print(process.processIdentifier)

我发现了如何获取进程的 PID,但我不知道如何在退出或即将退出时杀死它。

编辑

process.terminate() 有效,但我想要的行为是保持程序运行,直到它被手动终止(ctrl + c),用它来终止节点进程。我可以使用waitUntilExit() 保持程序运行,但是,如果我使用waitUntilExit(),则使用terminate() 将不起作用。

【问题讨论】:

  • 如果它没有响应 SIGTERM(即process.terminate()),那么它可能取决于节点进程本身。如果程序忽略了 SIGTERM,那么您要么需要重新编写它以不这样做,要么使用 SIGKILL。通常,您宁愿在可能的情况下使用 SIGTERM。
  • 请注意,Process.launchedProcess 在 10.13 中已弃用,并替换为 Process.run。在这里可能无关紧要,但值得注意。
  • @RobNapier 啊,谢谢你的来信。我应该解释得更好,process.terminate() 确实有效。将编辑原始帖子解释得更好。

标签: swift macos command-line


【解决方案1】:

正如this answer 建议的那样:

import Foundation

// Start the Node process...

signal(SIGINT, SIG_IGN)

let sigintSource = DispatchSource.makeSignalSource(signal: SIGINT, queue: .main)
sigintSource.setEventHandler {
    process.terminate() // Terminate the Node process
    exit(0)
}
sigintSource.resume()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    相关资源
    最近更新 更多