applicationDidFinishLaunching - de todos modos para obtener esto usando script / comando?

2

¿Hay alguna forma de detectar cuándo una aplicación ha terminado de iniciarse después de usarla open <path_to_app>en un shell? El aviso después de emitir el comando es inmediato, pero para las aplicaciones que tardan un tiempo en iniciarse por completo, se agotarán los eventos hasta que se inicie por completo ...

Utilizando ps aux | grep -i 'path to app' | grep -v grep | wc -l, devuelve un ID de proceso casi de inmediato (en el momento del inicio de la aplicación), por lo que no sirve.

Cualquier ayuda, muy apreciada.

Dave Yeaman
fuente
El comando 'top' tampoco parece dar una respuesta diferente al estado de apertura / lanzamiento.
Dave Yeaman
Dicho de otra manera, está probando para ver si la aplicación acepta eventos de la cola de eventos. Esta es la misma señal que determina si una aplicación se considera congelada / no responde por macOS. ¿Es posible determinar si una aplicación no responde en macOS? Vía spindumptal vez?
Graham Miln
Consulte ¿Cómo puedo determinar si una aplicación no responde? para enfoques alternativos.
Graham Miln
Esto realmente se está volviendo difícil, por algo que debería ser tan fácil, quiero decir ... el ícono rebota en el dock hasta que se completa por completo ... pensarías que podría haber una manera de consultar qué está haciendo el muelle ...
Dave Yeaman
1
Se resolvió monitoreando la columna STATE para el paquete de aplicaciones usando TOP. Esperar a que ESTADO cambie a 'dormir' durante un par de segundos fue el truco (para mí de todos modos).
Dave Yeaman el

Respuestas:

2

Se resolvió monitoreando la columna STATE para el paquete de aplicaciones usando TOP. Esperar a que ESTADO cambie a 'dormir' durante un par de segundos fue el truco (para mí de todos modos).

Dave Yeaman
fuente
0

Puede crear una herramienta de línea de comandos con Swift. Aquí está el código de muestra:

import AppKit

let timeout: TimeInterval = 5.0

let appToLaunch = ProcessInfo.processInfo.arguments.dropFirst().joined(separator: " ")
let runningApps = NSWorkspace.shared.runningApplications.map { $0.localizedName }

if runningApps.contains(appToLaunch) {
    exit(EXIT_SUCCESS)
}

NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.didLaunchApplicationNotification,
                                                  object: nil,
                                                  queue: nil) { (notification) in
    guard let appName = notification.userInfo?["NSApplicationName"] as? String
        else { return }
    if appName == appToLaunch {
        exit(EXIT_SUCCESS)
    }
}

let exitTimer = Timer.scheduledTimer(withTimeInterval: timeout, repeats: false) { _ in
    exit(EXIT_FAILURE)
}

RunLoop.current.run()

Pase el nombre de la aplicación como argumento. Por ejemplo:./listener Mini Calendar

Comprueba si la aplicación ya se está ejecutando. También puede establecer diferentes timeoutsi lo desea.

Mateusz Szlosek
fuente