作为分离过程启动命令行工具

时间:2019-04-27 16:14:22

标签: swift macos cocoa

通过bash调用命令行工具(lsProcess)是可行的,但不幸的是,它是作为子进程创建的。

我需要将工具作为一个单独的进程启动,而不必将其作为子进程添加到正在运行的应用程序中。

因此,我尝试使用启动服务来启动bash的独立过程

let ws = NSWorkspace.shared
let url = URL(fileURLWithPath: "/bin/bash")

let app = try ws.launchApplication(at: url, options: [.default], configuration: [
    .arguments: args,
    .environment: env
])

不幸的是,该电话似乎没有任何作用,我想它仅支持应用程序捆绑包?我如何启动流程,例如bash,而不创建子进程?

我基本上想做的是创建一个短暂的进程,该进程执行一件事并立即退出,而无需我的应用作为父项。

一种方法是创建一个fork s,使用setsid开始新会话并调用该命令的助手工具,但我宁愿不要依赖于外部工具并进行分叉我自己的过程是不可能的。从ppid=1的进程中完成调用是至关重要的。

1 个答案:

答案 0 :(得分:0)

首先,您不能创建不是子进程的进程。不是子进程的唯一进程是引导内核进程(PID 0)。其他所有进程都是其他进程的子进程。

您可以通过使用Process对象(以前为NSTask)(以前是简单的方法)或使用传统的UNIX函数之一(execle()等)运行可执行文件来完成此任务。 ),然后让它运行。

您唯一需要做的就是确保您的子进程没有与任何导致应用程序终止时导致其阻塞或停止的东西绑定在一起。最值得注意的是,将stdinstdoutstderr连接到什么都没有(请参见NSFileHandle.fileHandleWithNullDevice)或不受过程控制的文件或管道之类的东西。

启动可执行文件(task.lanch()),然后简单地丢弃Process对象;它会继续自行运行。