如何使用 launchd 註冊代理

如何使用 launchd 註冊代理

我無法在 OS X (Leopard) 上安排定期啟動launchctl/ 。launchd基本上,我無法在網上找到逐步說明列表,並且直觀的方法不起作用。

文件sync.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>net.madrat.utils.sync</string>
        <key>Program</key>
        <string>rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>-ar</string>
            <string>/path/to/folder/</string>
            <string>/path/to/backup/</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
    </dict>
</plist>

我已將此腳本放入路徑中~/Library/LaunchAgents

接下來,我已經掛號的該腳本使用

launchctl load ~/Library/LaunchAgents/sync.plist

最後,為了測試它是否有效,我開始了工作:

 launchctl start net.madrat.utils.sync

- 什麼都沒發生。rsync在終端機中手動執行命令會產生預期結果。

我相當確定該作業已正確註冊,因為如果我嘗試啟動一個不存在的作業,我會收到一條錯誤訊息(我沒有進入上面的命令)。

我做錯了什麼?

答案1

林貢是一個很好的GUI工具來管理launchd。該專案現在似乎不受支援......但它肯定仍然可以在 10.5.x 上運行。

但對於你的具體問題...你有嘗試過嗎

sudo launchctl list 

這將告訴您 .plist 是否正確觸發。如果守護程式未啟動,它將返回 1;如果啟動成功,它將返回「0」。也許尋找那個。

每當我看到「1」時,通常是因為我將腳本放在了錯誤的位置、拼字錯誤或權限設定不正確。

另外....經常重新啟動..我見過

launchctl start

在重新啟動的情況下無效..

另外,在仔細研究你的問題時......為什麼不將 rsync 程式碼放入 bash 腳本中......並將其貼上/usr/bin/......然後你可以只使用chmod+x該文件.. ....並簡化你的.plist隨時觸發該腳本......

答案2

長答案:

如果不了解一些基本原理,就很難使用 launchd。因此,您很可能找不到任何逐步說明,它具有如此多的功能。一個好的舉措是閱讀 ADC 入門指南:http://developer.apple.com/macosx/launchd.html

launchd您也可以閱讀和launchctl.plist 檔案語法的手冊頁launchd.plist

關於放置代理程式或守護程式的位置經常存在誤解,所以讓我在這裡提供一些相關資訊:

  • 如果您的作業需要在沒有使用者登入的情況下執行,請將其放在 /Library/LaunchDaemons 中。
  • 如果僅在使用者登入時有用,請將其放在 /Library/LaunchAgents 中,或放在特定使用者的個人 LaunchAgents 目錄中(~/Library/LaunchAgents)。
  • 不要將您的作業放在 /System/Library 中,該目錄是為系統提供的守護程序保留的。
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.
/System/Library/LaunchAgents   Mac OS X Per-user agents.
/System/Library/LaunchDaemons  Mac OS X System wide daemons.

簡短回答:

您的 plist 檔案的名稱可能是錯誤的,現在無法測試,但我會將其設定為 net.madrat.utils.sync.plist.unload如果您編輯了該文件,那麼在載入守護進程之前先載入它也可能很有用。

答案3

我找不到這實際上是標準行為的文檔,但似乎 launchd 需要 plist 文件中的絕對路徑。所以試試看/usr/bin/rsync吧。對我有用!

答案4

嘗試將此鍵新增到您的 plist 檔案中

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

相關內容