2016-02-11 65 views
0

我有一個OS X應用程序,我們稱之爲TestOSX.app。這是它的顯示名稱(據我所知,可從鍵取得)。AppleScript(或其他)檢查正在運行的應用程序並關閉最近打開的實例

由於各種各樣的原因(可以通過將應用程序複製到另一個地方或從終端打開它來避開它;如果CFBundleExecutable不是二進制文件,而是一個腳本,它會在之前設置一些東西啓動二進制文件本身......),我不能依靠OS X的內置策略阻止某人啓動應用程序的第二個實例,也不能使用LSMultipleInstancesProhibited密鑰。但我確實希望確保每個由同一用戶啓動的第二個實例在能夠修改某些資源之前即將退出。不同的用戶應該能夠同時運行他們自己的應用程序的單一實例(這是爲什麼LSMultipleInstancesProhibited是禁用)。

(我想建立一個機制,依靠flock(1)但它不會在OS X下存在)

所以,策略是:當用戶啓動我的應用程序,首先要檢查的是舊版本是否已經運行;如果有,請發送此最新的應用程序實例(腳本已執行「from」)退出請求,並將舊實例放到前臺。

我無法使用進程的名稱,因爲應用程序可能會使用一些嵌入式工具(如專有更新程序),這些工具的名稱與應用程序本身不同。這就是爲什麼這樣的事情是行不通的:

tell application "System Events" 
    set listOfProcesses to (name of every process where background only is false) 
end tell 

,作爲鑑定過程可以簡單地說updater(這是TestOSX包的一部分)。

我有一個片段,可能是「大件事」之分,但預期它不工作:

tell application "System Events" 
    set theProcess to first application process whose displayed name is "TestOSX" 
    set theOtherProcess to second application process whose displayed name is "TestOSX" 
    set frontmost of theOtherProcess to true 
end tell 

,這個總是帶來正面只有第一應用程序的過程。

,爲什麼它不能按預期工作,只要我不明白這一點:

tell application "System events" 
    set listOfProcesses to (name of every process whose (dsiplayed name is "TestOSX")) 
end tell 

回報兩個實例。我想在某個地方進程和名稱之間的映射正在丟失。

[編輯] 試圖修改上面使用的片段:

tell application "System Events" 
    set theOtherProcess to id of second application process whose displayed name is "TestOSX" 
    set frontmost of theOtherProcess to true 
end tell 

,但我得到的錯誤:

"Can't set frontmost of 680102 to true." 

(這可能是因爲我有實際啓動腳本二進制,如上所述?)

回答

0

好吧,我想出了一個醜陋的解決方案。

通過雙擊應用程序圖標啓動的bash腳本將檢查我的應用程序有多少實例正在運行(藉助於AppleScript)。如果答案不止一個,bash腳本將結束,因此我的整個應用程序終止。

launcher.command腳本:

#!/bin/bash 
val=$(osascript ./instances_counter.scpt "TestOSX") 

instances_counter.scpt,利用的說法我通過:

on run argv 
    tell application "System Events" 
     set theProcessList to every application process whose displayed name is item 1 of argv 
     set noOfProcesses to count of theProcessList 
    end tell 
    return noOfProcesses 
end run 

就是這樣。

相關問題