Nie mogę zaplanować okresowego uruchamiania z launchctl
/ launchd
na OS X (Leopard). Zasadniczo nie jestem w stanie znaleźć listy instrukcji krok po kroku w Internecie, a intuicyjne podejście nie działa.
sync.plist
Pliku:
<?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>
Umieściłem ten skrypt na ścieżce ~/Library/LaunchAgents
.
Następnie zarejestrowałem skrypt za pomocą
launchctl load ~/Library/LaunchAgents/sync.plist
Wreszcie, aby sprawdzić, czy to działa, rozpocząłem pracę:
launchctl start net.madrat.utils.sync
- Nic się nie stało. Ręczne wykonanie rsync
polecenia w terminalu daje oczekiwany wynik.
Jestem całkiem pewien, że zadanie zostało poprawnie zarejestrowane, ponieważ jeśli spróbuję uruchomić nieistniejące zadanie, pojawia się komunikat o błędzie (którego nie otrzymałem w powyższym poleceniu).
Co zrobiłem źle?
launchctl list
sam wyświetlacz 1, ale dopiero po tym, jak zaczął agenta ręcznie za pomocąlaunchctl start
.Długa odpowiedź:
Trudno pracować z uruchomionym bez zrozumienia podstawowych zasad. Jest więc prawdopodobne, że nie znajdziesz instrukcji krok po kroku, ma ona tak wiele możliwości. Dobrym posunięciem jest udanie się do przewodnika dla początkujących na ADC: http://developer.apple.com/macosx/launchd.html
Można także przeczytać strony man dla
launchd
,launchctl
i składni plików .plist,launchd.plist
.Często zdarza się nieporozumienie, gdzie umieścić agenta lub demona, więc pozwólcie, że przekażę kilka informacji na ten temat:
Krótka odpowiedź:
Nazwa twojego pliku listy może być niepoprawna, nie mogę teraz przetestować, ale ustawiłbym to na
net.madrat.utils.sync.plist
. Przydatne może być również najpierwunload
załadowanie demona przed załadowaniem go, jeśli edytowałeś plik.źródło
launchd bash
debugowania - ale to nie działa na Leopardzie (launchd
nie można uruchomić bezpośrednio).Nie mogę znaleźć dokumentacji, że jest to w rzeczywistości standardowe zachowanie, ale wydaje się, że uruchomienie wymaga bezwzględnych ścieżek w plikach plist. Więc spróbuj
/usr/bin/rsync
zamiast tego. Pracuje dla mnie!źródło
spróbuj tego, moje skrypty działają bez użycia części programu, wystarczy program args ...
zastąpić
z
źródło
spróbuj dodać te klucze do pliku Plist
źródło
W pliku .plist masz jedną niewłaściwą rzecz i jedną podejrzaną rzecz (każdy z tych punktów został poruszony we wcześniejszych odpowiedziach; gromadzę je tutaj).
Lepiej pisz:
Pierwszym argumentem w
ProgramArguments
tablicy jest program do wykonania - pominąłeś to. JeśliProgram
klucz zostanie pominięty, domyślnie ustawiany jest pierwszy argumentProgramArguments
; prawdopodobnie rozsądnie jest podać to tylko raz.Ponieważ pominąłeś ten pierwszy argument, twoja .plist będzie wywoływała rsync (poprzez nazwę
Program
), ale „pierwszy argument” rsync byłby/path/to/folder
, a nie-ar
(działający program będzie bardzo krótko widoczny naps
wyjściu, zanim wyjdzie z błąd, ale nazwany jako-ar
, który jest zawartością argumentu zerowego).Nie musisz podawać ścieżki do
rsync
, ale w tym kontekście prawdopodobnie rozsądnie jest to zrobić, aby uniknąć konieczności polegania naPATH
ustawieniu odpowiednio.Dokumentacja tego znajduje się w
launchd.plist(5)
. Zauważ, że ta strona podkreśla, że wartośćProgramArguments
klucza jest przekazywana doexecvp(3)
. To stronaexecvp
wyjaśniająca wyszukiwanie PATH.źródło