Potrzebujesz pomocy w rozwiązywaniu problemów / uczeniu się launchctl i plist

3

Zawsze byłem crontabem. Niedawno zdecydowałem się przełączyć na procesy uruchomieniowe Apple'a i nie mogę uruchomić mojej pierwszej wersji.

  1. The plutil -lint polecenie mówi mi, że plist jest poprawnie sformatowany. W rzeczywistości wyświetla „OK”.

  2. Uruchomiłem skrypt bash ręcznie i potwierdziłem, że działa poprawnie po ręcznym zainicjowaniu.

  3. Załadowałem plik używając loadctl load i otrzymałem odpowiedź „już załadowany” przy wielokrotnych próbach zrobienia tego samego.

Problem musi być w mojej definicji PLIST. Pomóż mi zauważyć błąd.

Spodziewam się, że będzie działać z następującymi warunkami:

  • Tylko gdy użytkownik jaredclemence korzysta z systemu
  • Raz natychmiast po zalogowaniu
  • Co 15 minut później
  • Zmień katalog na /Library/WebServer/Documents/medface/ przed uruchomieniem skryptu.

Plik plist wygląda następująco:

<?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>org.pediatricheartcenter.medface.crons</string>
        <key>User</key>
        <string>jaredclemence</string>
        <key>ProgramArguments</key>
        <array>
                <string>/User/jaredclemence/runMedfaceSchedTasks.batch</string>
        </array>
        <key>WorkingDirectory</key>
        <string>/Library/WebServer/Documents/medface</string>
        <key>StartInterval</key>
        <integer>900</integer>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>

Uwagi:

  • Zapisałem plik w ~/Library/LaunchAgents/org.pediatricheartcenter.medface.crons.plist
  • Poprzednia wersja użytego pliku Program zamiast ProgramArguments z <string> wartość zamiast tablicy.
Jared Clemence
źródło
1
Jako pierwszy krok w debugowaniu sugeruję ustawienie <key>StandardOutPath</key> i <key>StandardErrorPath</key> - Proponuję ~/Library/Logs/org.pediatricheartcenter.medface.crons.stdout (i ...stderr ) ponieważ jest to zwykła lokalizacja logowania dla agentów startowych, ale używaj tego, co działa dla ciebie. Dodaj echo lub printf s na początku i na końcu runMedfaceSchedTasks.batchi zobacz, co logi mówią po tobie launchctl load Twój plist.
John N
1
W dalszych badaniach odkryłem, że launchd zapisuje błędy w systemie.log. Znalazłem tam odpowiedź! Dziękuję, John!
Jared Clemence

Odpowiedzi:

4

Launchd zapisuje błędy w systemie.log. Używając konsoli, przeglądałem dziennik. Tam launchd powiedział mi, że nie podoba mi się mój User kluczowa wartość. Usunąłem parę klucz-wartość User-jaredclemence i ponownie załadowałem plist. Następnie powiedział mi, że program wsadowy nie istnieje, a następnie zauważyłem błąd w ścieżce pliku. /User powinno być /Users

Usuwając ustawienie User i poprawiając ścieżkę do pliku, udało mi się rozwiązać problem. Teraz działa ps -ef | grep 'runMed', Widzę, że plik wsadowy jest aktualnie wykonywany.

POWODZENIE!

Jared Clemence
źródło