Jak używać at i batch w systemie Linux do planowania poleceń

Photo of author

By maciekx

Jeżeli planujesz jednorazowe zadanie w systemie Linux, korzystanie z cron może być zbyt skomplikowane. Właściwym rozwiązaniem jest użycie polecenia at! Natomiast jeśli chcesz, aby procesy były uruchamiane tylko wtedy, gdy Twój system ma dostępne zasoby, warto wykorzystać polecenie batch.

Planowanie zadań w systemie Linux

Demon cron obsługuje listę zadań uruchamianych o określonych porach. Te zadania są wykonywane w tle zgodnie z harmonogramem. Umożliwia to elastyczne zarządzanie powtarzającymi się zleceniami. Niezależnie od tego, czy chodzi o uruchamianie zadania co godzinę, codziennie o konkretnej porze, czy raz w miesiącu lub roku, cron pozwala na jego konfigurację.

Jednak gdy chcesz wykonać zadanie tylko raz, cron nie jest najlepszym wyborem. Owszem, możesz je tam ustawić, ale musisz pamiętać o usunięciu wpisu z crontab po zakończeniu zadania, co jest niewygodne.

Jeśli napotykasz problem w Linuksie, istnieje duże prawdopodobieństwo, że ktoś inny już go rozwiązał. Na szczęście systemy operacyjne oparte na Uniksie istnieją od dłuższego czasu, więc istnieje duża szansa, że ktoś stworzył rozwiązanie dla Twojego problemu.

W przypadku opisanego wcześniej problemu istnieje odpowiednie rozwiązanie, zwane at.

Instalacja polecenia at

Aby zainstalować na Ubuntu, użyj następującego polecenia:

sudo apt-get install at

Po zainstalowaniu, aby uruchomić demona at, użyj polecenia:

sudo systemctl enable --now atd.service

Na Manjaro użyj poniższego polecenia:

sudo pacman -Sy at

Po instalacji, aby uruchomić demona at, wpisz:

sudo systemctl enable --now atd.service

W każdej dystrybucji możesz sprawdzić, czy demon atd działa, używając polecenia:

ps -e | grep atd

Interaktywne korzystanie z polecenia at

Aby użyć polecenia at, należy przypisać mu datę i godzinę wykonania. Istnieje wiele możliwości sformułowania tego, o czym porozmawiamy później.

Jednak nawet w trybie interaktywnym musisz określić datę i godzinę. Jeżeli nie podasz nic lub wpiszesz coś, co nie jest datą ani godziną, at odpowie „Zniekształcony czas”, jak pokazano poniżej:

at
at banana

Daty i godziny mogą być wyrażone w sposób bezpośredni lub względny. Na przykład, jeśli chcesz, aby polecenie wykonało się za minutę, możesz użyć:

at now + 1 minute

Polecenie at wyświetli komunikat i znak zachęty, czekając na wprowadzenie poleceń, które chcesz zaplanować. Zanim jednak to zrobisz, zwróć uwagę na komunikat, który się pojawia:

Mówi on, że polecenia będą uruchamiane w instancji powłoki sh, a nie w Bashu, który oferuje więcej funkcji. Jeśli Twoje skrypty lub polecenia spróbują użyć funkcji, które są dostępne w Bash, ale nie w sh, mogą się nie powieść.

Aby sprawdzić, czy Twoje polecenia działają w sh, uruchom powłokę sh:

sh

Wiersz poleceń zmieni się na znak dolara ($), co pozwoli na uruchamianie poleceń i sprawdzanie, czy działają poprawnie.

Aby powrócić do powłoki Bash, wpisz polecenie exit:

exit

Nie zobaczysz standardowych danych wyjściowych ani komunikatów o błędach z poleceń, ponieważ powłoka sh działa jako zadanie w tle, bez interfejsu ekranowego.

Wyniki poleceń, niezależnie od tego, czy są pozytywne, czy negatywne, są przesyłane do Ciebie mailem. Wysyłane są przez wewnętrzny system pocztowy do użytkownika, który uruchomił polecenie. Oznacza to, że musisz skonfigurować ten system pocztowy.

Wiele systemów Linux nie ma wbudowanego systemu pocztowego, ponieważ nie jest on powszechnie potrzebny. Zamiast tego korzysta się z systemów takich jak sendmail lub Postfix. Jeśli Twój system nie ma wbudowanego systemu pocztowego, możesz zapisać rezultaty do plików lub przekierować je do plików, aby uzyskać logi.

Jeżeli polecenie nie generuje żadnych danych wyjściowych ani komunikatów o błędach, nie otrzymasz również wiadomości e-mail. Wiele poleceń w systemie Linux sygnalizuje sukces ciszą, więc najczęściej nie dostaniesz powiadomienia.

Teraz czas na wprowadzenie polecenia at. W tym przykładzie użyjemy prostego skryptu o nazwie sweep.sh, który usuwa pliki o rozszerzeniach * .bak, * .tmp i * .o. Wprowadź ścieżkę do polecenia, jak pokazano poniżej, a następnie naciśnij Enter.

Pojawi się nowy wiersz poleceń, co pozwoli Ci dodać kolejne polecenia. Warto mieć polecenia w jednym skrypcie, a następnie wywołać ten skrypt z poziomu at.

Naciśnij Ctrl + D, aby zakończyć dodawanie poleceń. Zobaczysz komunikat , co oznacza koniec transmisji. Otrzymasz numer zadania oraz czas planowanego uruchomienia, jak pokazano poniżej:

Aby sprawdzić swoją pocztę wewnętrzną po wykonaniu zadania, wpisz:

mail

Jeśli nie otrzymasz żadnej wiadomości, oznacza to, że wykonanie było udane. Możesz również sprawdzić, czy pliki * .bak, * .tmp i * .o zostały usunięte, aby potwierdzić działanie skryptu.

Wpisz poniższe polecenie, aby ponownie uruchomić cały proces:

at now + 1 minute

Po minucie ponownie sprawdź pocztę:

mail

O, mamy nową wiadomość! Aby ją przeczytać, naciśnij 1, a następnie Enter.

Otrzymaliśmy wiadomość e-mail, ponieważ polecenia w skrypcie generowały komunikaty o błędach. W tym przypadku nie było plików do usunięcia, ponieważ podczas wcześniejszego uruchomienia skryptu zostały one usunięte.

Naciśnij D + Enter, aby usunąć wiadomość, a następnie Q + Enter, aby zamknąć program pocztowy.

Formaty daty i godziny

Masz dużą elastyczność w zakresie formatów czasu, które możesz używać. Oto kilka przykładów:

Uruchom o 11:00:

at 11:00 AM

Uruchom jutro o 11:00:

at 11:00 AM tomorrow

Uruchom o 11:00 tego dnia w przyszłym tygodniu:

at 11:00 AM next week

Uruchom o tej samej godzinie w przyszłym tygodniu:

at next week

Uruchom o 11:00 w następny piątek:

at 11:00 AM next fri

Uruchom o tej samej godzinie w następny piątek:

at next fri

Uruchom o 11:00 tego dnia w następnym miesiącu:

at 11:00 AM next month

Uruchom o 11:00 w konkretnym dniu:

at 11:00 AM 3/15/2020

Uruchom za 30 minut od teraz:

at now + 30 minutes

Uruchom za dwie godziny:

at now + 2 hours

Uruchom jutro o tej samej godzinie:

at tomorrow

Uruchom o tej samej godzinie w czwartek:

at thursday

Uruchom o 12:00:

at midnight

Uruchom o 12:00:

at noon

Jeśli jesteś z Wielkiej Brytanii, możesz nawet zaplanować polecenie na czas podwieczorku (16:00):

at teatime

Przeglądanie kolejki zadań

Aby zobaczyć kolejkę zaplanowanych zadań, użyj polecenia atq, jak pokazano poniżej.

Dla każdego polecenia w kolejce, atq wyświetli następujące informacje:

ID zadania
Data zaplanowania
Czas zaplanowania
Kolejka, w której znajduje się zadanie (oznaczone literami „a”, „b” itd.). Normalne zadania zaplanowane w at trafiają do kolejki „a”, podczas gdy te z polecenia batch trafiają do kolejki „b”.
Osoba, która zaplanowała zadanie.

Używanie at w wierszu poleceń

Nie musisz korzystać z at w trybie interaktywnym; możesz go także używać w poleceniach, co ułatwia integrację w skryptach.

Możesz przesłać polecenia do at, na przykład:

echo "sh ~/sweep.sh" | at 08:45 AM

Zadanie zostanie zaakceptowane i zaplanowane na wyznaczoną godzinę, a numer zadania oraz data wykonania zostaną wyświetlone tak jak wcześniej.

Używanie at z plikami poleceń

Możesz również zapisać sekwencję poleceń w pliku i przekazać go do at. Może to być zwykły plik tekstowy z poleceniami — nie musi być wykonywalnym skryptem.

Użyj opcji -f (file), aby przekazać nazwę pliku do at:

at now + 5 minutes -f clean.txt

Możesz również osiągnąć ten sam rezultat, redirectując plik do at:

at now + 5 minutes < clean.txt

Usuwanie zaplanowanych zadań z kolejki

Aby usunąć zaplanowane zadanie z kolejki, użyj polecenia atrm. Jeśli chcesz najpierw zobaczyć kolejkę i znaleźć numer zadania, które chcesz usunąć, użyj atq. Następnie użyj tego numeru zadania z atrm, jak pokazano poniżej:

atq
atrm 11
atq

Jak wyświetlić szczegółowy widok ofert pracy

Jak wcześniej wspomniano, możesz planować zadania na daleką przyszłość. Czasami można zapomnieć, co zawiera konkretne zadanie. Komenda atq pokazuje zadania w kolejce, ale nie ujawnia, co one robią. Jeśli chcesz zobaczyć szczegóły, użyj opcji -c (cat).

Najpierw użyj atq, aby znaleźć numer zadania:

atq

Teraz użyj zadania numer 13 z opcją -c:

at -c 13

Oto zestawienie informacji, które otrzymujemy na temat konkretnego zadania:

Pierwsza linia: Informuje nas, że polecenia będą działały w powłoce sh.
Druga linia: Wskazuje, że polecenia będą uruchamiane z identyfikatorem użytkownika i grupy równym 1000, co odpowiada osobie, która uruchomiła at.
Trzecia linia: Osoba, która otrzymuje e-maile po zakończeniu.
Czwarta linia: Maska użytkownika wynosi 22, co jest używane do ustalania domyślnych uprawnień dla plików tworzonych w tej sesji sh. Maska jest odejmowana od 666, co daje 644 (ósemkowy odpowiednik rw-r–r–).
Pozostałe dane dotyczą głównie zmiennych środowiskowych.

Wyniki testu sprawdzają, czy można uzyskać dostęp do katalogu wykonawczego. Jeśli nie, zgłaszany jest błąd i wykonanie zadania jest przerywane.
Polecenia do wykonania są wymienione wraz z zawartością zaplanowanych skryptów. Zauważ, że chociaż skrypt w naszym przykładzie został napisany dla Bash, nadal będzie wykonywany w powłoce sh.

Polecenie batch

Polecenie wsadowe działa podobnie do polecenia at, ale z trzema kluczowymi różnicami:

Można je używać tylko w trybie interaktywnym.
Zamiast planować wykonanie zadań o określonym czasie, dodajesz je do kolejki, a polecenie batch wykonuje je, gdy średnie obciążenie systemu spadnie poniżej 1,5.
Z tego powodu nie określasz daty i godziny w poleceniu batch.

Kiedy korzystasz z polecenia batch, uruchamiasz je po prostu bez dodatkowych parametrów:

batch

Następnie dodajesz zadania w sposób analogiczny do polecenia at.

Kontrola dostępu do polecenia at

Pliki at.allow i at.deny definiują, kto ma dostęp do grupy poleceń at. Znajdują się one w katalogu /etc. Domyślnie istnieje tylko plik at.deny, który jest tworzony podczas instalacji at.

Oto jak to działa:

at.deny: Zawiera listę użytkowników, którzy nie mogą korzystać z polecenia at.
at.allow: Zawiera listę użytkowników, którzy mogą korzystać z at. Jeśli plik at.allow nie istnieje, at korzysta tylko z pliku at.deny.

Domyślnie każdy ma dostęp do at. Jeśli chcesz ograniczyć dostęp, użyj pliku at.allow, aby określić, kto może korzystać z tego polecenia. Jest to łatwiejsze niż dodawanie wszystkich, którzy nie mają dostępu, do pliku at.deny.

Aby zobaczyć zawartość pliku at.deny, użyj:

sudo less /etc/at.deny

Plik ten zawiera listę użytkowników, którzy nie mogą korzystać z at. Wiele z nich jest zablokowanych z powodów bezpieczeństwa, więc nie powinieneś ich usuwać.

Teraz zmodyfikujemy plik at.allow, dodając do niego dave i mary, przy czym nikt inny nie będzie miał dostępu do at.

Aby to zrobić, wpisz:

sudo gedit /etc/at.allow

W edytorze dodajemy dwie nazwy, jak pokazano poniżej, a następnie zapisujemy plik.

Jeżeli ktoś inny spróbuje korzystać z at, otrzyma komunikat o braku uprawnień. Na przykład, jeśli użytkownik o imieniu eric wpisze:

at

Odmówiono mu dostępu, jak pokazano poniżej.

Eric nie jest wpisany do pliku at.deny. Jak tylko dodasz kogoś do at.allow, wszyscy inni nie będą mieli dostępu do at.

Idealne do jednorazowych zadań

Jak widać, zarówno polecenia at, jak i batch są idealne do jednorazowych zadań. Podsumowując:

Kiedy musisz wykonać coś, co nie jest rutynowym procesem, zaplanuj to za pomocą at.
Jeśli chcesz uruchomić zadanie tylko wtedy, gdy obciążenie systemu jest niskie, użyj polecenia batch.


newsblog.pl