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
Aby sprawdzić swoją pocztę wewnętrzną po wykonaniu zadania, wpisz:
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ę:
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
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.