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
Nakon što se posao izvrši, upišite sledeće da biste proverili internu poštu:
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:
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