Il processo degli eventi di sistema non inizia al login, quindi il ritardo potrebbe essere necessario per qualche altro motivo. Anche gli eventi di sistema vengono automaticamente interrotti se non vengono utilizzati per alcuni minuti.
Probabilmente non ti sarà d'aiuto, ma potresti provare a lanciare Eventi di sistema all'inizio dello script:
launch application "System Events"
Potresti anche provare a utilizzare un agente launchd come questo per avviare un processo degli eventi di sistema all'accesso:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
<key>Label</key>
<string>test</string>
<key>Program</key>
<string>/System/Library/CoreServices/System Events.app/Contents/MacOS/System Events</string>
<key>RunAtLoad</key> <!-- run at login -->
<true/>
<key>KeepAlive</key> <!-- run the program again if the previous program terminates -->
<true/>
</dict>
</plist>
Normalmente puoi usare qualcosa come tell application "System Events" to exists process "Finder"
per verificare se esiste un processo, ma ovviamente richiede di parlare con System Events. In questo caso potresti anche usare uno script di shell come questo:
repeat 100 times
do shell script "ps -eco comm= | grep -x 'System Events'; exit 0"
if result is not "" then exit repeat
delay 0.1
end repeat
ps -e
è identico a -ax
(include i processi di tutti gli utenti e processi senza terminali di controllo), -c
stampa i nomi dei comandi invece dei percorsi assoluti in OS X e -o comm=
stampa solo i nomi dei comandi senza il riga di intestazione. Puoi sostituire il comando shell con pgrep -x 'System Events'; exit 0
in 10.8 e versioni successive.