Jak ustawić zadanie, aby było uruchamiane tak często?

84

Jak uruchomić skrypt co, powiedzmy, 30 minut? Zakładam, że istnieją różne sposoby dla różnych systemów operacyjnych. Używam OS X.

stalepretzel
źródło

Odpowiedzi:

136

Po prostu użyj launchd . Jest to bardzo potężny system uruchamiania, a tymczasem jest to standardowy system uruchamiania dla Mac OS X (obecna wersja OS X nawet nie uruchomiłaby się bez niego). Dla tych, którzy nie są zaznajomieni z launchd(lub z OS X w ogóle), to jest jak krzyżówka init, cron, at, sysvinit ( init.d) inetd, upstarti systemd. Zapożyczanie koncepcji wszystkich tych projektów, ale jednocześnie oferowanie rzeczy, których nie znajdziesz nigdzie indziej.

Każda usługa / zadanie to plik. Lokalizacja pliku zależy od pytań: „Kiedy ma działać ta usługa?” i „Jakich uprawnień będzie potrzebować usługa?”

Zadania systemowe idą do

/Library/LaunchDaemons/

czy będą działać, bez względu na to, czy jakikolwiek użytkownik jest zalogowany do systemu, czy nie. Zostaną uruchomione z uprawnieniami „root”.

Jeśli mają działać tylko wtedy, gdy zalogowany jest jakikolwiek użytkownik, przechodzą do

/Library/LaunchAgents/

i zostanie wykonany z uprawnieniami użytkownika, który właśnie się zalogował.

Jeśli mają działać tylko wtedy , gdy jesteś zalogowany, idą do

~/Library/LaunchAgents/

gdzie ~ jest katalogiem HOME. Zadanie to będzie działać z Twoimi uprawnieniami, tak jakbyś sam je uruchomił za pomocą wiersza poleceń lub dwukrotnego kliknięcia pliku w Finderze.

Zauważ, że tam też istnieje /System/Library/LaunchDaemonsi /System/Library/LaunchAgents, jak zwykle, wszystkim pod kontrolą /Systemzarządza OS X. Nie umieszczaj tam żadnych plików, nie zmieniaj tam żadnych plików, chyba że naprawdę wiesz, co robisz. Grzebanie w folderze Systemy może sprawić, że system stanie się bezużyteczny (doprowadzi go do stanu, w którym nawet odmówi ponownego uruchomienia). Są to katalogi, w których Apple umieszcza launchdzadania, które uruchamiają system podczas rozruchu, automatycznie uruchamiają wymagane usługi, wykonują zadania konserwacji systemu i tak dalej.

Każde launchdzadanie zawiera plik w formacie plist. Powinien mieć odwrotną notację nazwy domeny. Np. Możesz nazwać swoje zadanie

com.example.my-fancy-task.plist

Ta lista może mieć różne opcje i ustawienia. Pisanie po jednym na rękę jest nieoptymalne, możesz chcieć pobrać darmowe narzędzie Lingon do tworzenia zadań. To narzędzie było kiedyś bezpłatne, teraz kosztuje 5 USD w sklepie z aplikacjami i 10 USD w wersji innej niż App Store (wersja bez App Store jest znacznie wydajniejsza i jeśli już planujesz za nią zapłacić, poważnie, kup sklep bez aplikacji wersja). Jeśli ktoś zna porównywalne narzędzie, które jest darmowe lub open source, napisz mi w komentarzach, a ja raczej je polecę (nie chcę tutaj reklamować komercyjnego oprogramowania).

Na przykład może to wyglądać tak

<?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.example.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

Ten agent będzie uruchamiał skrypt powłoki /usr/local/bin/my-script.sh co 1800 sekund (co 30 minut). Możesz także uruchomić zadanie w określonych dniach / godzinach (w zasadzie launchd może zrobić wszystko, co może zrobić cron) lub możesz nawet wyłączyć "OnDemand", powodując, że launchd utrzyma proces na stałe (jeśli zakończy się lub ulegnie awarii, launchd natychmiast go ponownie uruchomi) . Możesz nawet ograniczyć ilość zasobów, z których może korzystać proces (jak wspomniano wcześniej, Lingon pokazuje wszystkie te ustawienia w ładnym interfejsie UI).

Aktualizacja: mimo że OnDemandjest nadal obsługiwana, jest przestarzała. Nowe ustawienie zostało nazwane KeepAlive, co ma znacznie większy sens. Może mieć wartość logiczną, w którym to przypadku jest dokładnym przeciwieństwem OnDemand(ustawienie falsezachowania tak, jakby OnDemandbyło truei na odwrót). Wspaniałą nową funkcją jest to, że może mieć również wartość słownikową zamiast wartości logicznej. Jeśli ma wartość słownikową, masz kilka dodatkowych opcji, które zapewniają lepszą kontrolę nad ziarnem, w jakich okolicznościach zadanie zostanie utrzymane przy życiu. Np. Jest utrzymywany przy życiu tak długo, jak długo program zakończył działanie z zerowym kodem zakończenia, tylko tak długo, jak istnieje określony plik / katalog na dysku, tylko wtedy, gdy inne zadanie również jest aktywne, lub tylko wtedy, gdy sieć jest aktualnie uruchomiona.

Możesz także ręcznie włączać / wyłączać zadania za pomocą wiersza poleceń:

launchctl <command> <parameter>

polecenie może być załadowane lub wyładowane, aby załadować plist lub ponownie go wyładować, w takim przypadku parametrem jest ścieżka do pliku. Lub polecenie może być uruchomieniem lub zatrzymaniem, aby po prostu uruchomić lub zatrzymać takie zadanie, w którym to przypadku parametrem jest etykieta (com.example.my-fancy-task). Istnieją również inne polecenia i opcje.

Zapoznaj się z dokumentacją Apple dotyczącą formatu plist i launchctlnarzędzia wiersza poleceń (pamiętaj, że możesz wybrać wersję OS X u góry, ponieważ format / opcje różnią się między różnymi wersjami OS X)

Mecki
źródło
A jeśli jako użytkownik chcę, aby coś działało, nawet gdy nie jestem zalogowany? Czy to możliwe, czy muszę poprosić administratora o umieszczenie czegoś w / Library / LaunchDaemons?
Mark Baker,
@Mark: tak, Twój administrator musiałby to zrobić, a klucze UserName i GroupName musiałyby być odpowiednio ustawione w pliku .plist.
Steve Folly
Należy również zauważyć, że w systemie Leopard i nowszych wersjach OnDemand jest przestarzały i zastępuje klucz KeepAlive. Więcej informacji można znaleźć w man launchd.plist.
Steve Folly
1
LaunchControl soma-zone.com/LaunchControl jest bardzo przydatny, ma nieograniczoną wersję próbną, o ile wiem, że nie ma ograniczeń w porównaniu z wersją licencjonowaną.
BaneOfSerenity
1
@MaciekRek StartCalendarIntervalz tablicą dwóch słowników, zarówno z kluczem, jak Minutei wartością raz 00i raz 30zrobiłby dokładnie to, o co prosiłeś. W przyszłości proszę zadawać pytania jako pytania, a nie komentarze, wtedy mogę również pokazać ostateczny słownik (nie mogę tego zrobić w komentarzu). Ta strona służy zadawaniu pytań. Jeśli chcesz podpowiedzieć komuś pytanie, zamieść link do pytania jako komentarz, ale nie samo pytanie.
Mecki
47

możesz użyć bardzo wygodnego generatora plist: http://launched.zerowidth.com/ (nie musisz niczego kupować…)

da ci on-liniową powłokę do zarejestrowania nowego zaplanowanego zadania z już zalecanym uruchomieniem d

Kosmotaur
źródło
11

W systemie MacOSX masz co najmniej następujące opcje:

  • Powtarzający się alarm iCal z akcją „Uruchom skrypt”
  • launchd
  • cron ( link1 , link2 )

Z własnego doświadczenia wynika, że ​​najbardziej niezawodny jest cron. Kiedy testowałem, launchd miał wiele błędów i dziwactw. Alarmy iCal działają tylko wtedy, gdy jesteś zalogowany (ale może to być coś, co wolisz).

Bruno De Fraine
źródło
8

Jak zauważył Mecki, launchd byłby drogą do tego. Istnieje interfejs GUI dla launchd o nazwie Lingon, który możesz chcieć sprawdzić, w przeciwieństwie do ręcznej edycji plików launchd:

Lingon to graficzny interfejs użytkownika do tworzenia edycji plików konfiguracyjnych launchd dla systemu Mac OS X Leopard 10.5.

[fantastyczna okazja...]

Edycja pliku konfiguracyjnego jest łatwiejsza niż kiedykolwiek w tej wersji i ma dwa różne tryby. Tryb podstawowy, który ma najczęstsze ustawienia łatwo dostępne w bardzo prostym interfejsie i tryb eksperta, w którym możesz dodać wszystkie ustawienia bezpośrednio w tekście lub wstawić je za pomocą menu.

Sójka
źródło
Szczerze mówiąc, jest to świetny, łatwy w użyciu interfejs, który po prostu robi to i pozwala przejść dalej. Jeśli masz mało czasu, to jest właściwy sposób.
Joshua Pinter
4

MAC OS ma narzędzie Automator Tool, które jest takie samo jak Harmonogram zadań w systemie Windows. Korzystając z Automatora, możesz zaplanować codzienne zadania i połączyć zadanie z cyklicznym wydarzeniem w kalendarzu, aby codziennie uruchamiać skrypty o określonej godzinie. odnośnik do codziennego uruchamiania skryptów w systemie Mac OS

Jlearner
źródło
Przynajmniej w macOS Catalina (10.15.x) nie mogłem znaleźć sposobu na planowanie zadań w Kalendarzu za pomocą Automatora. Miałem znacznie lepsze wyniki z Lingonem (zobacz inne odpowiedzi, które wspominają jako interfejs do launchd).
calvinf
2

W przypadku skryptów Apple konfiguruję specjalny kalendarz iCal i używam alarmów do ich okresowego uruchamiania. W przypadku narzędzi wiersza poleceń używam launchd.

Mike Heinz
źródło
1

FYI: chociaż tęsknię za jego prostotą, cron to przeszłość na OS X. To był strażnik pantery. Od czasu premiery Tiger. Więc jeśli używasz Leoparda, cron nie wchodzi w grę.


źródło
1

Możesz użyć crona do planowania zadań.

crontab -e

Zadanie jest określone w następującym formacie.

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

Przykład:

0 12 * * *  cd ~/backupfolder && ./backup.sh

Po zainstalowaniu zadań crona możesz użyć crontab -l, aby wyświetlić listę zadań.

crontab -l

Jeśli chcesz dowiedzieć się więcej o wyrażeniach harmonogramu crona, możesz uzyskać do nich dostęp

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

UnchartedWorks
źródło