2017-01-07 75 views
1

我有這樣的代碼:從LaunchAgent 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>updater.Keychain.plist.sh</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>bash</string> 
     <string>-c</string> 
     <string>/Users/qwe/Music/meta.sh</string> 
     <string>/Users/qwe/Music/seta.sh</string> 

    </array> 
    <key>RunAtLoad</key> 
    <true/> 
</dict> 
</plist> 

的事情是,「meta.sh」是檢查每5第二個具體的東西是否正在發生,因此「seta.sh」從來沒有正在運行一個永無止境的腳本。當在終端中這樣做時,我可以簡單地使用&符號來使文件在後臺運行,但我已經在文件名的末尾嘗試了&amp;,但它並沒有真正起作用。任何人都可以幫我嗎?謝謝!!

+3

'seta.sh'沒有運行,不是因爲'meta.sh'永遠不會退出,而是因爲它只是'bash'的另一個參數,專門用於設置'meta.sh'看到的'$ 0'的值。 – chepner

+0

那麼如果meta.sh是一個永無止境的命令,你會怎麼做呢?但seta仍然是一個文件 –

回答

0

chepner的評論是正確的關於眼前的問題:你傳遞的腳本名稱bash錯誤。在-c選項之後,bash需要包含要執行的命令的單個參數(可選地,後跟傳遞給它的參數,從$0開始)。如果要執行多個命令,則需要將它們組合爲單個複合命令,如/Users/qwe/Music/meta.sh & /Users/qwe/Music/seta.sh

但我認爲你也使用launchd錯誤。 Launchd真的打算啓動流程,然後監控它們;這要求他們留在前臺。從launchd出發的事情往往會混淆它,導致出現奇怪的問題。例如,考慮我上面給出的命令字符串。它在後臺運行meta.sh,在前臺運行seta.sh。你說meta.sh是一個長期運行的過程,但我認爲seta.sh只是完成它的工作並退出?如果是這樣,launchd將看到seta.sh(前臺進程)已經退出,認爲任何子進程(meta.sh)都是剩餘的孤兒,它應該「清除它們」,即殺死它們。糟糕,meta.sh不再是長時間運行的。

如果你真的只想要啓動meta.sh和seta.sh,最好爲它們創建兩個單獨的啓動項目(即兩個.plist文件)。

如果需要出於某種原因同時運行它們,可能是最好的辦法是基本上創建運行兩者,然後等待兩個退出一個小的腳本,並傳遞「腳本」,以作爲打壞-c選項的參數。請注意,這意味着整個「腳本」必須是在一個單一的stringProgramArguments數組中:

<key>ProgramArguments</key> 
<array> 
    <string>bash</string> 
    <string>-c</string> 
    <string>/Users/qwe/Music/meta.sh &amp; /Users/qwe/Music/seta.sh; wait</string> 
</array> 

另一種可能性是添加AbandonProcessGroup關鍵的.plist,並沒有「劇本」等後臺進程完成:

<key>ProgramArguments</key> 
<array> 
    <string>bash</string> 
    <string>-c</string> 
    <string>/Users/qwe/Music/meta.sh &amp; /Users/qwe/Music/seta.sh</string> 
</array> 
<key>AbandonProcessGroup</key> 
<true/> 

...但其缺點是launchd會不知道有遺留下來的後臺進程,並在某些情況下,可能再次嘗試運行作業,導致兩人(或更多)後臺進程...

+0

哇感謝的人!我理解你,但是什麼是兩個不同的命令,而不是文件,第一個命令也是一個命令,直到用戶手動結束命令纔會結束,你會怎麼做,你會有兩個創建兩個不同的命令Plist檔案?謝啦! –

+0

你有沒有兩個轉義字符,如'與'&'? –

+0

@SUhost:糟糕,是的,我&'確實需要編碼;我會解決它。至於另外一個問題......我需要更多地瞭解你想要完成什麼,程序是什麼以及他們彼此之間的關係以便提出建議。順便說一句,因爲命令基本上同時運行,哪個命令是「第一」並不重要,是嗎? –