gpt4 book ai didi

swift - MacApp(使用 Swift)如果终止则不会终止启动的子进程

转载 作者:行者123 更新时间:2023-12-03 16:45:09 24 4
gpt4 key购买 nike

我有一个非常简单的 MacOS Swift 应用程序,用作启动器来提供停靠图标。应用程序启动主脚本。但是,如果应用程序终止(例如,通过单击它并在上下文菜单中选择“关闭”),则带有脚本的子进程将继续运行。

如果应用程序被终止,如何更改此行为以终止子进程。使用 pgrep 我检查并在子进程中执行脚本:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

@IBOutlet weak var window: NSWindow!

func applicationDidFinishLaunching(_ aNotification: Notification) {
print("App started!\n");

DispatchQueue.global(qos: .background).async {

let process = Process()
process.executableURL = URL(fileURLWithPath:"/usr/local/bin/node")
process.arguments = ["./build/index.js"]
process.currentDirectoryPath = "/Users/myaccount/basedir"
process.terminationHandler = { (process) in
print("didFinish")
}
do {
try process.run()
} catch {}

}

}

func applicationWillTerminate(_ aNotification: Notification) {
print("I'll never show up\n")
}

}

最佳答案

到目前为止,我找到了两种可能的解决方案,也在我的问题的评论的帮助下:

1.) “正确的方法” - 使用应用程序退出回调

Process 对象可以设为全局/实例范围,以便在 applicationWillTerminate 回调中终止它。但我遇到了问题,这个函数永远不会被调用。借助这个forum question我发现需要在Info.plist中将以下两个选项设置为“NO”:

XCode Info.plist

然后就可以完美运行了。

2.) 让子进程监视父进程

可以很容易地获取父进程的 pid (ProcessInfo().processIdentifier),在启动子进程时将其作为参数提供,并让子进程监视父进程 id - 当父进程 id 为 no 时活得更久, child 可以自杀。可以通过运行 kill -0 PID 来监视进程,如果不存在进程,则会引发错误。

关于swift - MacApp(使用 Swift)如果终止则不会终止启动的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60673388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com