2016-11-01 123 views
0

我有一個啓動代理,只要連接了USB設備就運行bash腳本。我希望它只運行一次,但是當我連接設備時,腳本每10秒繼續運行一次。啓動代理每10秒運行一次腳本

這裏是plist中:

<?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>com.example.program</string> 
    <key>Program</key> 
    <string>/Users/Peter/Desktop/test1.sh</string> 
    <key>LaunchEvents</key> 
    <dict> 
     <key>com.apple.iokit.matching</key> 
     <dict> 
      <key>com.apple.device-attach</key> 
      <dict> 
       <key>idProduct</key> 
       <integer>1476</integer> 
       <key>idVendor</key> 
       <integer>1356</integer> 
       <key>IOProviderClass</key> 
       <string>IOUSBDevice</string> 
       <key>IOMatchLaunchStream</key> 
       <true/> 
      </dict> 
     </dict> 
    </dict> 
</dict> 
</plist> 

下面是腳本:

#!/bin/bash 
open -a "Spotify"; 
sleep 11; 

我加了睡眠11,因爲我讀了劇本需要運行至少10秒鐘,讓launchd的思考它完成了它的任務。然而,這並沒有幫助。

在運行launchctl list com.example.program終端給出:

"LimitLoadToSessionType" = "Aqua"; 
"Label" = "com.example.program"; 
"TimeOut" = 30; 
"OnDemand" = true; 
"LastExitStatus" = 0; 
"Program" = "/Users/Peter/Desktop/test1.sh"; 

回答

0

默認情況下,launchd會啓動程序時,他們推出的條件得到滿足,然後重新啓動他們,如果他們退出或崩潰。爲防止它重新啓動腳本,只需將<key>KeepAlive</key><false/>添加到.plist中(然後卸載並重新加載它)。可能還需要添加以阻止殺死「剩餘」Spotify進程的啓動(儘管我認爲它將在沒有此功能的情況下運行)。

+0

不幸的是,添加這些鍵並沒有什麼區別。有趣的是,當我在終端中運行launchctl list com.example.program時,我沒有看到這些新鍵。這是正常的嗎? –

+0

@JohnSmith這聽起來像你需要重新加載.plist。嘗試'launchctl unload/path/to/com.example.program.plist',然後'launchctl unload/path/to/com.example.program.plist'。 (注意:*不要*使用'sudo';這會把它當作一個守護進程,而不是一個代理。) –

+0

我重新加載它。它不起作用。 –