2013-07-03 40 views
2

我想弄清楚在OS X服務器上觸發launchd守護進程的方法。我發現我可以設置launchd守護進程來偵聽特定的套接字連接(tcp端口),當連接時,它將執行一個腳本。我已經成功完成了所有這些,除了當我例如打開一個連接到套接字(用於telnet測試目的)時,即使在我丟棄套接字連接之後腳本也會無限地執行。OS X通過套接字啓動

的launchd plist中:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//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.app</string> 
    <key>Program</key> 
    <string>/usr/bin/true</string> 
    <key>Sockets</key> 
    <dict> 
     <key>Listeners</key> 
     <dict> 
      <key>SockServiceName</key> 
      <string>1234</string> 
     </dict> 
    </dict> 
    <key>inetdCompatibility</key> 
    <dict> 
     <key>Wait</key> 
     <true/> 
    </dict> 
</dict> 
</plist> 

有誰知道爲什麼腳本被一次又一次的叫什麼?我的目標是有當從一個客戶端建立一個套接字連接的腳本來只執行一次......

任何幫助表示讚賞,文斯

回答

3

通過在inetdCompatibility字典指定Wait = true你告訴launchd的你應用程序負責在偵聽套接字上調用accept以使用其中一個掛起的連接。如果未能做到這一點,連接將在偵聽套接字上保持排隊,導致launchd認爲您的應用程序仍然有新的工作要做。您可以確保應用程序在啓動時調用accept以消耗掛起的連接,或者指定Wait = false已啓動,以代表您的方式呼叫accept

+0

太好了,非常感謝bdash現在按預期工作 – CRE8IT