Я создаю утилиту командной строки в Swift. В main.swift
у меня есть класс, который открывает процесс с Process
. Пока этот процесс не запущен, мое приложение также должно работать. Я добиваюсь этого по телефону:
let sema = DispatchSemaphore(value: 0)
let myClass = MainClass(..., errorHandler: {
print("anything went wrong here, so end the application")
sema.signal() // ends this programm
})
sema.wait()
Это работает довольно хорошо ... когда вызывается errorHandler, sema.signal()
завершает мой инструмент. Но как я могу иметь противоположный путь? Когда я заканчиваю свое приложение вручную (в XCode), процесс продолжает выполняться.
У меня есть этот код, чтобы открыть процесс:
self.task = Process()
self.task!.executableURL = runURL
self.task!.currentDirectoryURL = directoryURL
self.task!.arguments = arguments
// The ouput of the process
let errorPipe = Pipe()
let outputPipe = Pipe()
self.task!.standardError = errorPipe
self.task!.standardOutput = outputPipe
self.errorHandler = errorPipe.fileHandleForReading
self.outputHandler = outputPipe.fileHandleForReading
self.errorHandler!.readabilityHandler = { pipe in
...
errorHandler()
}
self.outputHandler!.readabilityHandler = { pipe in
...
}
try? self.task!.run()
EDIT
Я звоню /bin/sh tail -f myfile.log
в процессе наблюдения за лог-файлом. После завершения tail все еще работает в мониторе активности.