
我無法在 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/>