Jak zarejestrować agenta z uruchomionym


14

Nie mogę zaplanować okresowego uruchamiania z launchctl/ launchdna OS X (Leopard). Zasadniczo nie jestem w stanie znaleźć listy instrukcji krok po kroku w Internecie, a intuicyjne podejście nie działa.

sync.plistPliku:

<?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 rsyncpolecenia 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?

Odpowiedzi:


5

Lingon to dobre narzędzie GUI do zarządzania uruchomionymi. Wygląda na to, że projekt nie jest już obsługiwany ... ale na pewno nadal działa w wersji 10.5.x.

Ale do konkretnego problemu ... próbowałeś

sudo launchctl list 

Dzięki temu dowiesz się, czy .plist działa poprawnie. Zwróci 1, jeśli demon nie będzie lauchował, a „0”, jeśli się powiedzie. Może poszukaj tego.

Ilekroć widzę „1”, zwykle dzieje się tak dlatego, że umieszczam skrypt w niewłaściwym miejscu, robię literówkę lub źle ustawiam uprawnienia.

Także .... często restartuję .. Widziałem

launchctl start

nie będzie skuteczny w przypadku ponownego uruchomienia ..

Ponadto, patrząc na twoje pytanie bliżej ... dlaczego nie po prostu umieść ten kod rsync w skrypcie bash ... i włóż go /usr/bin/..... Wtedy możesz po prostu chmod+xten plik ... i uprościć .plist odpalić ten skrypt, kiedy tylko chcesz ...


Dzięki, umieszczenie polecenia w dodatkowym pliku powłoki i uruchomienie, które załatwiło sprawę. Jest to jednak bardzo niezadowalające rozwiązanie… dlaczego bezpośrednie wywoływanie polecenia nie działa? Nawiasem mówiąc, launchctl list sam wyświetlacz 1, ale dopiero po tym, jak zaczął agenta ręcznie za pomocą launchctl start.
Konrad Rudolph

Nie jestem pewien, ale myślę, że uruchomione pliki .plist są tak naprawdę przeznaczone do definiowania kryteriów „uruchamiania na żądanie” dla demonów ... Być może nie było pewne, co zrobić z argumentami przekazanymi w <key> ProgramArguments </key>.
CaseyIT

11

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, launchctli 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:

  • Jeśli twoje zadanie musi zostać uruchomione, nawet gdy żaden użytkownik nie jest zalogowany, umieść je w / Library / LaunchDaemons.
  • Jeśli jest to przydatne tylko wtedy, gdy użytkownicy są zalogowani, umieść go w / Library / LaunchAgents lub w osobistych katalogach LaunchAgents określonych użytkowników (~ / Library / LaunchAgents).
  • Nie umieszczaj swojej pracy w / System / Library, która jest zarezerwowana dla demonów dostarczanych przez system.
~/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.

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ż najpierw unloadzaładowanie demona przed załadowaniem go, jeśli edytowałeś plik.


Dzięki za informację. Jednak: (1) Przeczytałem już wszystkie dokumenty, które dowiązałeś powyżej, i kilka innych. Nigdzie nie jest powiedziane, jak uruchomić agenta. (Przynajmniej nigdzie go nie znalazłem.) Byłoby dobrze, gdyby działało moje intuicyjne podejście. (2) Zmiana nazwy pliku też nie działa. :-( (3) niektóre informacje są nieaktualne. Na przykład sugerują polecenie launchd bashdebugowania - ale to nie działa na Leopardzie ( launchdnie można uruchomić bezpośrednio).
Konrad Rudolph

@Konrad Rudolph: Nie ma za co: :) @ Skylarking dostaje kilka interesujących punktów: czy sprawdziłeś przesłanie pliku? Lub użyłeś polecenia sudo? Musiałem też czasami restartować, aby launchctl działał poprawnie.
Arko

3

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/rsynczamiast tego. Pracuje dla mnie!


0

spróbuj tego, moje skrypty działają bez użycia części programu, wystarczy program args ...

zastąpić

    <key>Program</key>
    <string>rsync</string>
    <key>ProgramArguments</key>
    <array>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

z

    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

0

spróbuj dodać te klucze do pliku Plist

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

0

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:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

Pierwszym argumentem w ProgramArgumentstablicy jest program do wykonania - pominąłeś to. Jeśli Programklucz zostanie pominięty, domyślnie ustawiany jest pierwszy argument ProgramArguments; 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 na pswyjś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 na PATHustawieniu odpowiednio.

Dokumentacja tego znajduje się w launchd.plist(5). Zauważ, że ta strona podkreśla, że ​​wartość ProgramArgumentsklucza jest przekazywana do execvp(3). To strona execvpwyjaśniająca wyszukiwanie PATH.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.