Я разрабатываю приложение для мониторинга процессов с наибольшим потреблением в Swift, но я застрял в части получения списка процессов, которые в данный момент выполняются. Я пробовал много вещей, таких как:
- Выполнение команд
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)!
- Использование
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? Если есть другой способ, с помощью которого я мог бы получить по крайней мере два процесса, потребляющих больше всего ресурсов ЦП, он тоже подойдет.
Заранее спасибо.