Получите полный список запущенных процессов (включая процессы, принадлежащие root) с помощью Swift

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

  1. Выполнение команд top или ps aux | less и анализ вывода.

Я попытался использовать этот код для запуска команды top и передачи вывода в NSPipe, чтобы проанализировать его позже, но я не могу запустить команду, потому что она выдает ошибку Couldn't posix_spawn: error 13, и я ничего не смог найти на Интернет о том, как это исправить, поэтому мне пришлось найти другой способ.

let task = Process()
let pipe = Pipe()

task.standardOutput = pipe
task.launchPath = "/usr/bin"
task.arguments = ["top"]
task.launch()
task.waitUntilExit()

let data = String(data: pipe.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8)!
  1. Использование NSWorkspace.shared.runningApplications

Я видел этот вопрос о переполнении стека по той же теме , но на него нет ответа (один комментарий ссылается на другой поток, который отвечает, как это сделать на C, но это не то, что я на самом деле ожидал). OP потока использовал приведенный ниже код, чтобы получить полный список запущенных процессов, но он возвращает только те, которые принадлежат пользователю, поэтому он не очень полезен.

let workspace = NSWorkspace.shared
let applications = workspace.runningApplications        

for application in applications {

    if let url = (application.executableURL?.absoluteString) {

            os_log("%{public}s", log:scribe, type:.debug, url)
        }
    }
}

Вывод

Есть ли способ получить список запущенных процессов в macOS (включая процессы, принадлежащие root) в Swift? Если есть другой способ, с помощью которого я мог бы получить по крайней мере два процесса, потребляющих больше всего ресурсов ЦП, он тоже подойдет.

Заранее спасибо.


person iAlex11    schedule 12.01.2021    source источник
comment
Эта ошибка возникает и с другими задачами, которые будут получать какой-то непрерывный вывод, а не своевременный вывод. Отключение песочницы иногда устраняет эти проблемы, но часто вы получаете сообщение об ошибке stdin is no terminal. Более мягкий способ запуска этих задач — написать небольшой сценарий оболочки или встроить эмулятор терминала, такой как SwiftTerm или что-то в этом роде.   -  person HackMac    schedule 15.01.2021