Czy ktoś może polecić dobry tutorial do pisania (od zera) uruchomionej pracy w stylu crona?

19

Mam dość prostą pracę, którą chciałbym wykonywać co godzinę. Mógłbym to zrobić za pomocą cron, ale pomyślałem, że skorzystam z tego, aby się dowiedzieć launchd, ponieważ słyszę o tym dobre rzeczy. Mam man launchd.pliststronę jako odniesienie, ale szukam czegoś bardziej opartego na budowaniu przykładowej pracy.

Hank Gay
źródło
To powinno zostać przeniesione do Stackoverflow.
Philip Regan
5
@Philip Regan Myślałem o tym, ale dla mnie nie ma zbyt wiele programowania. Gdybym zadawał cronpytanie, czy superuser.com nie byłby właściwym miejscem? Ponieważ launchdjest to wersja Apple cron(a także daemontoolsi ewentualnie innych rzeczy), pomyślałem, że to moja najlepsza opcja.
Hank Gay
Możesz również umieścić go w skrypcie automatyzatora i uruchomić z programu iCal - jeśli działa tak jak Ty
user151019
Jak na ironię, trzy lata później sam muszę wdrożyć proces cron / launch i znów patrzę na to pytanie w zupełnie innym świetle. Przepełnienie stosu ma mieszane zdanie na temat tego, co zrobić z uruchomionymi pytaniami, ale tak naprawdę nie lubią tych pytań. Pomyślałem, że cała ta sytuacja jest zabawna. +1
Philip Regan

Odpowiedzi:

14

launchduruchamia demony ( /Library/LaunchDaemonslub /System/Library/LaunchDaemons) jako root i uruchamia je bez względu na to, czy użytkownicy są zalogowani, czy nie. Agenty uruchamiania ( /Library/LaunchAgents/lub ~/Library/LaunchAgents/) są uruchamiane, gdy użytkownik jest zalogowany jako ten użytkownik. Nie można użyć setuid do zmiany użytkownika uruchamiającego skrypt na demonach. /SystemKatalog jest zarezerwowany dla systemu Mac OS X zadań więc polecam oddanie launchdlisty właściwości albo do /Librarylub ~/Libraryfolderu jak ma to sens.

Więc pierwszym krokiem jest ustalenie, czy tworzysz agenta, czy demona.

Drugim krokiem jest utworzenie .plistpliku. Możesz użyć programów opartych na GUI, takich jak Lingon, aby w tym pomóc lub po prostu użyć swojego ulubionego edytora tekstu:

Przykład .plisturuchomienia skryptu co godzinę ( StartIntervallub StartIntervalCalendarsą to klucze, których potrzebujemy - StartIntervalaby element pojawiał się co xsekundę, StartIntervalCalendardla określonej godziny i / lub daty. Zobacz 126907 w SuperUser dla przykładu, który wykonałem za pomocą StartCalendarInterval):

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

Zmodyfikuj .plistodpowiednio, aby wskazać skrypt i wszelkie argumenty, jeśli to konieczne (argumenty znajdują się w osobnych wierszach) i zapisz plik o tej samej nazwie co wartość Label, ale z .plistkońcem. (na przykład local.my-mac.flickrstatszostanie zapisany jako local.my-mac.flickrstats.plist). Jeśli jeszcze tego nie zrobiłeś, przenieś ten .plistplik do /Library/LaunchDaemonspodczas tworzenia demona (działa cały czas) lub do ~/Library/LaunchAgents(tylko jesteś zalogowany) lub /Library/LaunchAgents(dowolny użytkownik jest zalogowany).

Aby rozpocząć zadanie, które chcesz uruchomić launchctlw razie potrzeby, załaduj plik. W przypadku przedmiotów w /Librarynależy użyć sudo: na przykładsudo launchctl load -w /PATH/TO/PLIST

W celach informacyjnych zapoznaj się również z następującymi pytaniami na temat superużytkownika : Uruchom komendę jako root , Załaduj ogólnosystemowego demona i Jak mogę uzyskać skrypt do uruchamiania codziennie

Chealion
źródło
4

Wiem, że to nie jest dobry samouczek, ale możesz zajrzeć do Przewodnika programowania demonów i usług firmy Apple, który zawiera sekcję Planowanie zadań czasowych.

Wiem, że nie jest to pełny samouczek, ale dzięki niemu możesz zrozumieć podstawy launchd.

Podaje również przykład crondzadania:

<?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>com.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>
Studer
źródło
Głosowałem za tym, ponieważ przyznałeś, że zasób nie jest tym, o co prosiłem, i uderzyło mnie to trochę jako RTFM, ale przemyślałem go ponownie i chciałbym wycofać moją opinię. Niestety nie mogę, chyba że pytanie jest edytowane (było za długie) i nie mam jeszcze wystarczającej liczby przedstawicieli do edycji. Czy możesz coś ulepszyć? Dzięki.
Hank Gay
@Hank Gay: Dzięki za komentarz. Zredagowałem również swoją odpowiedź.
Studer
4

To bardzo mi pomogło: http://launchd.info

Obejmuje konfigurację, administrację i rozwiązywanie problemów za pomocą terminalu lub uruchomionego GUI LaunchControl . Podano również przykłady.

kowl
źródło
2

Wiem, że szukałeś samouczka, ale przypadkowo ktoś tu przychodzi w ramach szukania narzędzia, które pomoże mu tworzyć / edytować uruchomione wpisy, korzystałem z tego wcześniej: Lingon (sourceforge)

Nie jest już aktywnie rozwijany, ale to, co tam działa, działa (i oczywiście obejmuje źródło itp.). Użyłem go w systemie Snow Leopard do planowania kopii zapasowych w chmurze Amazon itp.

robsoft
źródło
Lingon jest teraz w App Store, więc jest nadal aktywny, po prostu nie za darmo, patrz < peterborgapps.com/lingon >
user151019
Wersja sklepu została sparaliżowana przez wymagania Apple. Wstępnie skompilowana wersja SourceForge działa dobrze - chociaż modalne okno dialogowe zapisu, informujące mnie o wylogowaniu lub ponownym uruchomieniu, aby umożliwić demonowi, nie zostanie odrzucone. Musiałem zamknąć program z jego menu (nie wymuszać wyjścia) i sprawdzić, czy plik został poprawnie zapisany. Okaleczone w tym wyzwalaczu pliku i katalogu nie są obsługiwane, ani nie można utworzyć czegoś, co działa jako root w wersji AppStore.
marfarma