我有一個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."
(這可能是因爲我有實際啓動腳本二進制,如上所述?)