Како користити ат и групно на Линук-у за заказивање команди

Ukoliko imate potrebu da zakažete izvršavanje Linux zadatka koji treba da se obavi samo jednom, korišćenje cron-a bi bilo previše komplikovano. Komande iz porodice at su ono što vam je potrebno! Dodatno, ako želite da pokrenete procese jedino kada vaš sistem raspolaže slobodnim resursima, batch komanda je pravi izbor.

Kako zakazati Linux poslove

Cron demon čuva spisak poslova koje izvršava u unapred određenim vremenskim intervalima. Ovi zadaci i programi se izvršavaju u pozadini u zakazano vreme. Ovo vam daje veliku fleksibilnost u zakazivanju poslova koje je potrebno ponavljati. Bez obzira da li vam je potreban zadatak koji se izvršava jednom na sat, u određeno vreme svakog dana, ili jednom mesečno ili godišnje, sve to možete definisati u cron-u.

Međutim, ovo rešenje nije optimalno ukoliko želite da zadatak izvršite samo jednom. Naravno, možete ga podesiti u cron-u, ali nakon toga morate da se vratite i uklonite unos u crontab po završetku zadatka, što nije praktično.

U svetu Linux-a, ako se suočite sa nekim problemom, gotovo je sigurno da se još neko borio sa istim. Srećom, kako operativni sistemi nalik Unix-u postoje već dugo vremena, velika je verovatnoća da je neko već kreirao rešenje za vaš problem.

Za problem opisan gore, rešenje postoji i zove se at.

Instalacija at komande

at komandu je bilo potrebno instalirati na Ubuntu 18.04 i Manjaro 18.1.0 (na Fedora 31 je već bila instalirana).

Za instalaciju na Ubuntu koristite sledeću komandu:

sudo apt-get install at

Nakon završetka instalacije, možete pokrenuti at demon sa ovom komandom:

sudo systemctl enable --now atd.service

Na Manjaro-u, instalaciju vršite sa sledećom komandom:

sudo pacman -Sy at

Po završetku instalacije, upišite sledeću komandu za pokretanje at demona:

sudo systemctl enable --now atd.service

Na bilo kojoj distribuciji, možete upisati sledeću komandu kako biste proverili da li je atd demon pokrenut:

ps -e | grep atd

Kako interaktivno koristiti komandu at

Da biste koristili at, morate mu dodeliti datum i vreme za izvršavanje. Postoji velika fleksibilnost u načinu na koji možete da ih definišete, što ćemo detaljnije objasniti kasnije u ovom članku.

Međutim, čak i kada koristite interaktivno, morate unapred da navedete datum i vreme. Ukoliko ne uključite ništa u komandnu liniju, ili unesete nešto što nije datum i vreme, at će odgovoriti sa „Neispravno vreme“, kao što je prikazano ispod:

at
at banana

Datumi i vremena mogu biti eksplicitni ili relativni. Na primer, recimo da želite da se komanda izvrši za jedan minut. at razume šta znači „sada“, tako da možete koristiti „now“ i dodati mu minut, na primer:

at now + 1 minute

at ispisuje poruku i at prompt i čeka da unesete komande koje želite da zakažete. Međutim, prvo pogledajmo poruku, kao što je prikazano ispod:

Ova poruka vas obaveštava da se pokreće instanca sh shell-a i da će komande biti izvršene unutar njega. Vaše komande se neće izvršavati u Bash shell-u, koji je kompatibilan sa sh shell-om, ali ima bogatiji skup funkcija.

Ukoliko vaše komande ili skripte pokušaju da koriste funkciju ili mogućnost koju Bash pruža, ali sh ne, neće uspeti.

Lako je testirati da li će se vaše komande ili skripte izvršiti u sh. Koristite komandu sh da pokrenete sh shell:

sh

Komandna linija se menja u znak dolara ($), i sada možete pokrenuti svoje komande i proveriti da li ispravno rade.

Da biste se vratili na Bash shell, upišite komandu exit:

exit

Nećete videti nikakav standardni izlaz ili poruke o grešci od komandi. To je zato što se sh shell pokreće kao pozadinski zadatak i radi bez ikakvog interfejsa na ekranu.

Svaki izlaz iz komandi – dobar ili loš – šalje vam se putem e-pošte. Šalje se preko internog sistema pošte osobi koja pokreće at komandu. To znači da morate da podesite i konfigurišete taj interni sistem e-pošte.

Mnogi (većina) Linux sistema nemaju interni sistem e-pošte, jer retko postoji potreba za njim. Oni koji ga imaju obično koriste sistem poput Sendmail ili Postfix. Ukoliko vaš sistem nema interni sistem e-pošte, možete koristiti skripte za pisanje u datoteke, ili preusmeriti izlaz u datoteke kako biste kreirali logove.

Ako komanda ne generiše standardni izlaz ili poruku o grešci, svakako nećete dobiti e-poštu. Mnoge Linux komande ukazuju na uspeh putem tišine, tako da u većini slučajeva nećete dobiti e-poštu.

Sada je vreme da unesete komandu za at. Za ovaj primer, koristićemo malu skript datoteku pod nazivom sweep.sh koja briše datoteke *.bak, *.tmp i *.o. Upišite putanju do komande, kao što je prikazano ispod, a zatim pritisnite Enter.

Pojavljuje se još jedna komandna linija i možete dodati onoliko komandi koliko želite. Obično je zgodnije imati sve komande u jednoj skripti i jednostavno pozvati tu skriptu unutar at.

Pritisnite Ctrl+D da biste rekli da ste završili sa dodavanjem komandi. at prikazuje , što znači kraj transmisije. Izveštava vas o broju posla i vremenu kada je posao zakazan za izvršavanje, kao što je prikazano ispod:

Nakon što se posao izvrši, upišite sledeće da biste proverili internu poštu:

mail

Ukoliko nema nove pošte, morate pretpostaviti da je posao uspešno obavljen. Naravno, u ovom slučaju možete proveriti i videti da li su datoteke *.bak , *.tmp i *.o izbrisane kako biste potvrdili da je komanda radila.

Unesite sledeće da biste ponovo pokrenuli ceo proces:

at now + 1 minute

Nakon jednog minuta, upišite sledeće kako biste ponovo proverili poštu:

mail

Imamo poštu! Da biste pročitali poruku broj jedan, pritisnite 1, a zatim pritisnite Enter.

Primili smo e-mail od at jer su komande u skripti generisale poruke o grešci. U ovom primeru nije bilo datoteka za brisanje, jer ih je skripta uklonila kada smo je prethodno pokrenuli.

Pritisnite D+Enter da izbrišete e-poštu i Q+Enter da zatvorite program za poštu.

Formati datuma i vremena

Imate veliku fleksibilnost kada su u pitanju formati vremena koje možete koristiti. Evo nekoliko primera:

Izvršavanje u 11:00:

at 11:00 AM

Izvršavanje sutra u 11:00:

at 11:00 AM tomorrow

Izvršava se na današnji dan sledeće nedelje u 11:00:

at 11:00 AM next week

Izvršava se u ovo vreme, ovog dana, sledeće nedelje:

at next week

Izvršavanje u 11:00 narednog petka:

at 11:00 AM next fri

Izvršava se u ovo vreme sledećeg petka:

at next fri

Izvršava se u 11:00 na ovaj datum, sledećeg meseca:

at 11:00 AM next month

Izvršava se u 11:00 na određeni datum:

at 11:00 AM 3/15/2020

Izvršavanje 30 minuta od sada:

at now + 30 minutes

Izvršavanje dva sata od sada:

at now + 2 hours

Izvršava se sutra u ovo vreme:

at tomorrow

Izvršava se u ovo vreme u četvrtak:

at thursday

Izvršavanje u 12:00 časova (ponoć):

at midnight

Izvršavanje u 12:00 časova (podne):

at noon

Ako ste Britanac, možete čak i zakazati da se komanda izvrši u vreme čaja (16:00):

at teatime

Pregled reda poslova

Možete upisati komandu atq da biste videli red zakazanih poslova, kao što je prikazano ispod.

Za svaku komandu u redu, atq prikazuje sledeće informacije:

ID posla
Zakazan datum
Ugovoreno vreme
Red u kojem se posao nalazi. Redovi su označeni sa „a“, „b“ itd. Uobičajeni zadaci koje zakazujete idu u red „a“, dok zadaci koje planirate sa batch komandom (o kojima će biti reči kasnije u ovom članku) idu u red „b“.
Osoba koja je zakazala posao.

Korišćenje at komande na komandnoj liniji

Ne morate da koristite at interaktivno; možete ga koristiti i na komandnoj liniji. Ovo olakšava upotrebu unutar skripti.

Možete preneti komande u at, na sledeći način:

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

Posao se prihvata i zakazuje, a broj posla i datum izvršenja se prijavljuju kao i ranije.

Korišćenje at sa datotekama komandi

Takođe možete sačuvati niz komandi u datoteci, a zatim je proslediti at komandi. Ovo može biti obična tekstualna datoteka sa komandama – ne mora da bude izvršna skripta.

Možete koristiti opciju -f (datoteka) na sledeći način da prosledite ime datoteke at komandi:

at now + 5 minutes -f clean.txt

Isti rezultat možete postići ako preusmerite datoteku na at komandu:

at now + 5 minutes < clean.txt

Uklanjanje zakazanih poslova iz reda

Da biste uklonili zakazani posao iz reda, možete koristiti komandu atrm. Ukoliko prvo želite da vidite red, kako biste pronašli broj posla koji želite da uklonite, možete koristiti komandu atq. Zatim, upotrebite taj broj posla sa atrm, kao što je prikazano u nastavku:

atq
atrm 11
atq

Kako videti detaljan prikaz poslova

Kao što smo ranije spomenuli, možete zakazati poslove daleko u budućnost. Ponekad možete zaboraviti šta će posao raditi. Komanda atq vam prikazuje poslove u redu, ali ne i ono što će uraditi. Ukoliko želite da vidite detaljan prikaz posla, možete koristiti opciju -c (cat).

Prvo ćemo koristiti atq da pronađemo broj posla:

atq

Sada ćemo koristiti posao broj 13 sa opcijom -c:

at -c 13

Evo pregleda informacija koje dobijamo o poslu:

Prvi red: Ovo nam govori da će se komande izvršavati pod sh shell-om.
Drugi red: Vidimo da će se komande pokrenuti sa ID-om korisnika i grupe od 1000. Ovo su vrednosti za osobu koja je pokrenula komandu at.
Treći red: Osoba koja prima bilo kakvu e-poštu dolazi ovde.
Četvrti red: User Mask je 22. Ovo je maska koja se koristi za postavljanje podrazumevanih dozvola za sve datoteke kreirane u ovoj sh sesiji. Maska se oduzima od 666, što nam daje 644 (oktalni ekvivalent rw-r--r--).
Preostali podaci: Većina su promenljive okruženja.

Rezultati testa. Test proverava da li se može pristupiti izvršnom direktorijumu. Ako ne može, javlja se greška i izvršenje posla se napušta.
Komande koje treba izvršiti. One su navedene i prikazani su sadržaji zakazanih skripti. Imajte na umu da iako je skripta u našem primeru iznad napisana za pokretanje pod Bash-om, ona će se i dalje izvršiti u sh shell-u.

Komanda batch

Komanda batch deluje slično komandi at, ali uz tri bitne razlike:

Komandu batch možete koristiti samo interaktivno.
Umesto da planirate poslove za izvršavanje u određeno vreme, vi ih dodajete u red čekanja, a batch komanda ih izvršava kada je prosečno opterećenje sistema niže od 1.5.
Zbog gore navedenog, nikada ne navodite datum i vreme sa komandom batch.

Kada koristite batch komandu, pozivate je po imenu bez parametara komandne linije, na sledeći način:

batch

Zatim dodajte zadatke kao što biste to uradili sa at komandom.

Kontrolisanje pristupa at komandi

Datoteke at.allow i at.deny kontrolišu ko može da koristi at porodicu komandi. One se nalaze u direktorijumu /etc. Podrazumevano postoji samo datoteka at.deny i kreira se kada je at instaliran.

Evo kako ove datoteke funkcionišu:

at.deny: Navodi aplikacije i entitete koji ne mogu da koriste at za zakazivanje poslova.
at.allow: Navodi ko može da koristi at za zakazivanje poslova. Ukoliko datoteka at.allow ne postoji, at koristi samo datoteku at.deny.

Podrazumevano, svako može da koristi at. Ukoliko želite da ograničite ko može da ga koristi, koristite datoteku at.allow da navedete one koji to mogu. Ovo je lakše nego dodavati sve koji ne mogu da koriste at u datoteku at.deny.

Evo kako izgleda datoteka at.deny:

sudo less /etc/at.deny

Datoteka navodi komponente operativnog sistema koje ne mogu da koriste at. Mnoge od njih su sprečene da to urade iz bezbednosnih razloga, tako da ne želite da uklonite nijednu iz datoteke.

Sada ćemo urediti datoteku at.allow. Dodajemo Dejva i Meri, ali nikome drugom neće biti dozvoljeno da koristi at.

Prvo upisujemo sledeće:

sudo gedit /etc/at.allow

U editoru dodajemo dva imena, kao što je prikazano ispod, a zatim sačuvamo datoteku.

Ukoliko neko drugi pokuša da koristi at, biće mu javljeno da nema dozvolu. Na primer, recimo da korisnik po imenu Erik upiše sledeće:

at

On bi bio odbijen, kao što je prikazano u nastavku.

<p