Запустите инструмент командной строки как отдельный процесс - PullRequest
0 голосов
/ 27 апреля 2019

Вызов инструмента командной строки (bash, ls) через Process работает, но, к сожалению, он создается как дочерний процесс.

Мне нужно запустить инструмент как отдельный процесс, не добавляя его в качестве подпроцесса в запущенное приложение.

Поэтому я попытался запустить отдельный процесс 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 голосов
/ 27 апреля 2019

Прежде всего, вы не можете создать процесс, который не является дочерним процессом.Единственный процесс, который не является дочерним процессом - это процесс ядра начальной загрузки (PID 0).Любой другой процесс является дочерним по отношению к какому-либо другому процессу.

Это можно сделать, запустив исполняемый файл, используя объект Process (ранее NSTask) (простой способ) или один из традиционных UNIX.функции (execle() и т. д.), а затем просто дайте ему запуститься.

Единственное, что вам нужно сделать, это убедиться, что ваш дочерний процесс не привязан ни к чему, что может привести к его блокировке илиостановитесь, когда ваше приложение завершится.В частности, подключите stdin, stdout и stderr ни к чему (см. NSFileHandle.fileHandleWithNullDevice) или к чему-то вроде файла или канала, который не контролируется вашим процессом.

Запустите исполняемый файл (task.lanch()), а затем просто отбросьте объект Process;он продолжит работать самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...