繁体   English   中英

将命令行工具作为分离的进程启动

[英]Launch Command Line Tool as detached Process

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

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

因此,我尝试使用启动服务启动一个分离的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的进程完成的,这一点至关重要。

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

您可以通过使用Process对象(以前称为NSTask )(最简单的方法)或使用传统的 UNIX 函数之一( execle()execle()启动可执行文件来实现这一点,然后让它运行。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM