Planiranje zadataka u Linuxu pomoću Crontaba

  • Cron je demon koji izvršava planirane zadatke, a Crontab je datoteka u kojoj su oni definirani, s fleksibilnom sintaksom zasnovanom na pet polja vremena i naredbi.
  • Pravilna konfiguracija vremena, dozvola, apsolutnih putanja i varijabli okruženja ključna je za osiguravanje ispravnog izvršavanja cron poslova bez tihih grešaka.
  • Cron vam omogućava automatizaciju sigurnosnih kopija, čišćenja, ažuriranja i praćenja, ali ako se loše isplanira, može uticati na performanse i sigurnost sistema.
  • Postoje alati i alternative kao što su Anacron, Fcron, launchd ili eksterni servisi koji proširuju ili zamjenjuju Cron u složenijim scenarijima ili u drugim sistemima.

Planiranje zadataka u Linuxu pomoću Crontaba

Ako svakodnevno koristite Linux, prije ili kasnije ćete morati automatizirati repetitivne zadatke pomoću Crona i Crontaba : sigurnosne kopije, ažuriranja, generiranje izvještaja, čišćenje datoteka, praćenje i još mnogo toga. Ručno obavljanje svega toga oduzima puno vremena i lako se zaboravi. Tu nastupa Cron, temelj administracije Unixa i GNU/Linux sistema već decenijama.

Iako sintaksa Crontab-a na prvi pogled može djelovati pomalo zastrašujuće, kada shvatite njenu logiku, vidjet ćete da je zakazivanje zadataka u Linuxu pomoću Crontab-a mnogo jednostavnije nego što se čini . Ovaj članak pruža sveobuhvatan vodič: šta je Cron, šta je Crontab, kako pisati pravila, kako otklanjati greške, njegov potencijalni utjecaj na performanse, eksterne alate koje možete koristiti, alternative na drugim sistemima i slučajeve upotrebe za kućnu i poslovnu upotrebu.

Razlike između Crona i Crontaba

Cron i Crontab se često spominju kao sinonimi, ali zapravo su to dvije različite komponente koje rade zajedno . Razumijevanje ove razlike uštedjet će vam mnogo problema kada trebate otklanjati greške u zadacima koji se ne izvršavaju.

  • cron To je daemon koji radi u pozadini od trenutka pokretanja sistema. Njegov posao je vrlo jednostavan: pregledajte niz konfiguracijskih datoteka svake minute i provjerite da li je potrebno izvršiti neke planirane zadatke prema datumu i vremenu sistema.
  • crontabSa svoje strane, to je tekstualna datoteka u kojoj su ti zadaci definiraniSvaki korisnik može imati vlastitu crontab datoteku, sa svojim pravilima i skriptama, koje se izvršavaju s njihovim dozvolama. Cron daemon čita ove datoteke i izvršava naredbe kada je to potrebno.

U bilo kojoj modernoj Linux distribuciji obje komponente su dostupne po defaultu, tako da možete zakazivati ​​periodične zadatke u gotovo bilo kojoj distribuciji , bilo da se radi o Debianu, Ubuntuu, Oracle Linuxu, CentOS-u, Rockyju, Fedori itd.

Cron

Šta je Cron i zašto je sistemsko vrijeme kritično?

Cron je sistemski daemon koji se pokreće prilikom pokretanja Linuxa . Obično se pokreće putem klasičnih boot skripti u /etc/init.d ili ekvivalentnim putanjama poput /etc/rc.d , ili putem systemd jedinica (servis crond ili cron, ovisno o distribuciji). Svake minute provjerava:

Pretražite /etc/crontab, /etc/cron.d, /var/spool/cron i /var/spool/cron/crontabs (tačna putanja varira ovisno o distribuciji), tražeći unose koji odgovaraju trenutnoj minuti. Ako pronađe bilo koji, izvršite naznačenu naredbu.

Nešto što mnogi ljudi previđaju je da se Cron u potpunosti oslanja na sistemsko vrijeme . Ako sat ili vremenska zona nisu ispravno konfigurirani, vaši zadaci će se izvršavati u pogrešno vrijeme. Da biste provjerili vrijeme na modernim sistemima, možete koristiti:

timedatectl

Ova naredba prikazuje lokalno vrijeme, UTC, vremensku zonu i da li se sistem sinhronizuje sa NTP (Network Time Protocol) serverima. Idealno bi bilo da NTP sinhronizacija bude omogućena , jer to omogućava automatsko ispravljanje sata.

Ako ustanovite da je vremenska zona netačna, možete je promijeniti pomoću nečega poput `timedatectl set-timezone Europe/Madrid` ili druge vremenske zone koja odgovara vašoj zemlji. Osim toga, mnoge Linux instalacije automatski konfiguriraju NTP, ali ako ga želite prilagoditi, možete urediti `/etc/ntp.conf` ili koristiti alternativne servise poput chrony.

Šta je Crontab i kako je strukturiran?

Crontab je datoteka u koju upisujete pravila za pokretanje planiranih zadataka . Svaki red (ignorišući komentare) predstavlja "zadatak": kada se pokreće i koja se naredba izvršava. Obično svaki korisnik ima svoj crontab u spool direktoriju: /var/spool/cron ili /var/spool/cron/crontabs , ovisno o distribuciji.

Za upravljanje vašim ličnim crontab-om, koristite komandu `crontab` sa nekoliko osnovnih, ali moćnih opcija. Datoteke se ne uređuju ručno pomoću RAW editora, već putem ove komande kako bi se izbjegle greške u dozvolama ili formatiranju.

Osnovna sintaksa linije u Crontabu zasniva se na pet polja za vremenske oznake i naredbi :

m h dom mon dow comando

  • Minuta (m): vrijednosti od 0 do 59.
  • planina (h): vrijednosti od 0 do 23.
  • Dan u mesecu (Ned): od 1 do 31.
  • Mes (pon): od 1 do 12 ili skraćeni naziv (jan, feb, itd., u skladu sa sistemom).
  • Radnim danom (dolje): od 0 do 6 ili od 0 do 7, pri čemu je nedjelja 0 (a ponekad i 7).
  • Komanda: bilo koja komanda koju možete pokrenuti u terminalu, uključujući skripte i preusmjeravanja.

Tipičan primjer bi bio:

00 19 * * * /home/usuario/scripts/backup.sh

Ova linija označava da će se skripta izvršavati svaki dan u 19:00 sati, bez obzira na dan u mjesecu, mjesecu ili dan u sedmici.

crontab

Kako kreirati, urediti i prikazati vaš Crontab

Za rad s vašom ličnom datotekom zadataka, gotovo uvijek koristite samu naredbu crontab . Ideja je da ne uređujete ručno datoteke u /var/spool/cron/crontabs , jer je namijenjeno da ih sistem automatski upravlja.

Najčešće narudžbe su:

  • crontab -eOtvorite crontab u vašem zadanom tekstualnom editoru (u mnogim distribucijama) energija o nano) da biste kreirali ili mijenjali unose.
  • crontab -l: prikazuje na ekranu sve zadatke planirane za vašeg korisnika.
  • crontab -rIzbrišite cijeli crontab; ovo je nepovratna radnja. Ne traži potvrdu ako ne dodate -i.
  • crontab -i -r: traži potvrdu prije brisanja crontab datoteke.
  • crontab datoteku: zamijenite trenutni crontab sadržajem navedene datoteke.
  • crontab -u korisnik: upravljati crontab-om drugog korisnika (samo root ili oni sa dozvolama).
  • crontab -c redNa sistemima koji to podržavaju, definiše direktorijum u koji će se crontab čuvati.

Ako želite napraviti sigurnosnu kopiju postavki, možete učiniti nešto jednostavno kao što je:

crontab -l > ~/crontab_backup.txt

A ako ga kasnije trebate vratiti, jednostavno:

crontab ~/crontab_backup.txt

Napredna sintaksa: specijalni znakovi u Crontabu

Pored brojeva, Crontab omogućava upotrebu specijalnih znakova koji sintaksu čine mnogo fleksibilnijom . Zahvaljujući njima, možete izraziti raspone, liste ili intervale na kompaktan način.

  • * (zvjezdica): označava "sve moguće vrijednosti" u tom polju. Na primjer, * u polju za sate To znači sve sate.
  • , (jesti): odvojena lista specifičnih vrijednosti. Primjer: 0 6,18 * * * Počinje u 6:00 i 18:00 sati.
  • - (scenario): definira a kontinuirani raspon. Primjer: 0 8-17 * * 1-5 Vozi svakog sata od 8 do 17 sati, od ponedjeljka do petka.
  • / (kosa crta)označi a korak ili interval. Na primjer, */10 * * * * znači "svakih 10 minuta".
  • raspon/osim (u zavisnosti od implementacije): neke varijante omogućavaju definisanje isključenih vrijednosti, iako to nije standardno u svim cron poslovima.

Tipičan primjer kombinovane upotrebe bio bi:

*/5 2 * * 1-5 /bin/ejecutar/script.sh

Ova linija izvršava naredbu svakih 5 minuta tokom 2:00 ujutro, od ponedjeljka do petka . To je kompaktan način za zamjenu dugačke liste minuta.

Znak # (tarabica) na početku reda se koristi za dodavanje komentara . Sve nakon tog simbola u istom redu se ignoriše, što je savršeno za dokumentovanje zašto posao postoji ili za njegovo privremeno onemogućavanje bez brisanja.

Ključne riječi i vremenske prečice u Crontabu

Za većinu uobičajenih slučajeva, Crontab nudi prečice u obliku "rezervisanih riječi" koje zamjenjuju sva vremenska polja. Ovo je vrlo korisno kada želite nešto poput "svaki dan" ili "svaki sat" bez potrebe za razmišljanjem o brojevima.

  • @reboot: izvršava komandu kada se sistem pokrene.
  • @godino o @godišnjejednom godišnje, što je ekvivalentno 0 0 1 1 *.
  • @monthlyjednom mjesečno, prvog dana u ponoć, što je ekvivalentno 0 0 1 * *.
  • @weeklyjednom sedmično, u ponoć 0. dana (obično nedjelja), što je ekvivalentno 0 0 * * 0.
  • @daily o @midnightjednom dnevno, u 00:00, što je ekvivalentno 0 0 * * *.
  • @hourly: jednom svakog sata, u minuti 0, što je ekvivalentno 0 * * * *.

Na primjer, ako želite da se skripta izvršava svaki sat , jednostavno uradite sljedeće:

@hourly /bin/ejecutar/script.sh

A ako želite da se skripta za održavanje pokreće nakon svakog ponovnog pokretanja , koristili biste:

@reboot /ruta/a/mi_script.sh

Varijable okruženja i sintaksa komandi

Tipičan izvor grešaka je to što Cron se pokreće u minimalnom okruženjuNe puni ti .bashrc niti cijelo vaše korisničko okruženje, tako da PATH je vrlo ograničen (obično je to nešto poput /usr/bin:/binOvo pravi komande poput Python, Git, PHP ili Pip Ne mogu se pronaći ako ne koristite apsolutnu putanju.

Da biste to izbjegli, imate dvije mogućnosti: Uvijek koristite potpune rute u vašim skriptama (na primjer, /usr/bin/python3 umesto python) ili Definišite varijable okruženja na početku vašeg crontab-aPrimjer bi bio:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
HOME=/home/usuario

Ovi redovi se nalaze na početku crontab datoteke, bez polja za vrijeme , i utiču na sve ostale poslove koje deklarišete ispod. Također možete definirati MAILTO da biste odredili adresu e-pošte na koju se šalju standardni izlaz i poruke o greškama iz poslova.

Imajte na umu da naredbe u Crontabu prihvataju sve sintakse shell-a . Možete preusmjeriti izlaz u datoteku, povezati naredbe s cijevima itd. Na primjer, da biste sačuvali sav izlaz skripte u dnevnik :

* * * * * /home/usuario/helloworld.sh >> /var/log/logs.log 2>&1

A ako želite potpuno utišati poruke i ne primati e-poruke za taj zadatak, možete preusmjeriti na /dev/null :

* * * * * /home/usuario/helloworld.sh >/dev/null 2>&1

Upravljanje izlazom: zapisnici i e-pošta

U zavisnosti od distribucije i konfiguracije, Cron izlaz se može obraditi na nekoliko načina. Na sistemima poput Oracle Linuxa ili minimalnog Debiana, ako nije instaliran mail broker, cron daemon šalje izlaz direktno sistemu za evidentiranje.

U mnogim slučajevima možete vidjeti cron aktivnost u datotekama kao što su:

  • /var/log/cron (tipično za Oracle Linux, CentOS, RHEL).
  • / var / log / syslog (uobičajeno u Debianu i derivatima).

Na primjer, da biste filtrirali samo poruke vezane za cron na sistemu koji koristi syslog, možete učiniti nešto slično sljedećem:

grep CRON /var/log/syslog

Informacije su obično kratke (vrijeme, korisnik, naredba), ali vam pomažu da vidite da li nešto radi ili ne funkcioniše ispravno.

Ako instalirate agenta za transport pošte (MTA) kao što je Postfix ili Sendmail, zatim se šalje izlaz poslova u lokalni red čekanja pošte korisnikaObično se čuva u /var/spool/mail/$USER ili slične rute, a možete ga pročitati pomoću alata kao što su mail x (naredba mail).

Osim toga, možete kontrolirati primatelja cron e-poruka koristeći varijablu MAILTO na početku crontab datoteke:

MAILTO="[email protected]"

Ako umjesto toga ostavite MAILTO prazno, ovako:

MAILTO=""

Tada se neće slati e-pošta ni za jedan od zadataka definiranih u tom crontabu , što je korisno ako imate mnogo zadataka koji generiraju konstantan izlaz.

crontab guru

Alati i uslužni programi za rad s Cronom

Ako vam nije ugodno pisati cron izraze ručno, postoji nekoliko alata koji vam mogu pomoći da generirate pravila bez grešaka . Neki su web servisi, drugi su grafičke aplikacije.

  • Crontab Guru: Vrlo praktična stranica na kojoj pišete cron izraz i on... Objasnite šta radi u tekstu koji je čitljiv ljudimaUpozorava vas na greške i nudi uobičajene primjere i savjete.
  • Generator Cron zadatakaOnline asistent za generiranje cron izraza iz opcija kao što su vrijeme, dan, interval itd. Omogućava vam kreiranje ponavljajućih poslova sa unaprijed definirane postavke i personalizirajte ih.
  • EasyCron: usluga u oblaku za zakazivanje HTTP zahtjeva prema URL-ovima u određenim intervalima. Široko se koristi za pokretanje web skripti, API zadataka itd., s kontrolnom pločom, logovima i e-mail obavijestima.
  • KDE Cron (KCron)grafički alat integriran u KDE okruženje za Kreirajte, mijenjajte i brišite cron poslove bez dodirivanja komandne linijeOmogućava vam odabir vremena i datuma iz vizualnog interfejsa.
  • Cron Maker: online generator cron izraza dizajniran za integrirati se s Quartz bibliotekom (široko korišten u Java okruženjima), ali koristan i za razumijevanje složenih kombinacija.

Ovi uslužni programi ne zamjenjuju Cron na vašem sistemu, ali pojednostavljuju dio sastavljanja izraza , smanjujući sintaktičke greške.

Vrste Crontab-a: sistemski i korisnički

U Linuxu postoje dvije glavne vrste konfiguracijskih datoteka za planirane zadatke: sistemski crontab i korisnički crontab . Obje koriste vrlo sličnu sintaksu, ali se njima ne upravlja na isti način.

Sistemski crontab , koji se obično nalazi u /etc/crontab i datotekama unutar /etc/cron.d , obično zahtijeva root privilegije . Koristi se za kritične sistemske zadatke (rotacija logova, održavanje baze podataka, sigurnosne kopije visokog nivoa, itd.) i, za razliku od korisničkog crontaba, eksplicitno uključuje polje korisničko ime u svakom redu kako bi se naznačio korisnički račun pod kojim se naredba izvršava.

Korisnički crontabovi se upravljaju pomoću `crontab -e` i pohranjuju se u `/var/spool/cron/crontabs` ili sličnoj lokaciji. Samo korisnik može pokretati vlastite zadatke (ili root, koji može upravljati tuđim zadacima) i ne bi ih trebalo direktno uređivati. Da biste ograničili ko može koristiti cron, možete izmijeniti datoteke `/etc/cron.allow` i `/etc/cron.deny`.

Utjecaj Crona i Crontaba na performanse

Iako sam Cron troši vrlo malo resursa, loše raspoređivanje zadataka može negativno utjecati na performanse sistema . Problem obično nije sam cron daemon, već ono što planiramo da se pokrene.

Kada zakažete istovremeno izvršavanje mnogo zadataka, možete uzrokovati skokove u korištenju CPU-a i RAM-a . Na primjer, pokretanje tri velike sigurnosne kopije, ponovnog indeksiranja baze podataka i skripte za analizu logova u isto vrijeme gotovo je sigurno da će se server usporiti.

Ako zadaci uključuju umrežavanje (udaljene sigurnosne kopije, sinhronizacije s rclone-om , prijenos velikih količina podataka), možete generirati preopterećenje propusnog opsega, povećanu latenciju i ping , što utječe na druge servise koji ovise o vezi.

Također postoji rizik od sukoba zadataka : dva skripta koja istovremeno rade na istoj datoteci ili bazi podataka s različitim operacijama mogu uzrokovati oštećenje podataka ili čudne greške koje je teško dijagnosticirati.

Da biste ograničili utjecaj, možete koristiti uslužne programe poput nice za smanjenje prioriteta CPU-a zadatka ili cpulimit za ograničavanje maksimalnog postotka CPU-a koji proces može potrošiti:

  • Nizak prioritet CPU-a:
    0 19 * * * usuario nice -n 19 /ruta/script.sh
  • Ograničenje opterećenja procesora na 50%:
    0 19 * * * usuario cpulimit -l 50 /ruta/script.sh

Korištenje Crontaba za rutinske zadatke: sigurnosne kopije, čišćenje i praćenje

Jedna od velikih prednosti Crona je ta što vam omogućava da gotovo bez napora automatizujete "održavanje" vašeg računara , poboljšavajući performanse na srednji rok i štedeći vrijeme.

Vrlo uobičajena upotreba je periodično čišćenje privremenih datoteka, predmemorija i praznih direktorija . Pomoću skripte koja briše stare ili prazne datoteke na određenim lokacijama možete osloboditi prostor i smanjiti fragmentaciju datotečnog sistema.

Još jedan koristan obrazac je zakazivanje ažuriranja sistema i aplikacija tokom sati van vršnih opterećenja. Na primjer, noćni zadatak koji pokreće `apt update && apt upgrade` (ili ekvivalent u vašoj distribuciji) omogućava sistemu da bude ažuriran bez prekidanja svakodnevnog rada.

Također možete automatizirati zatvaranje aplikacija koje su predugo bile neaktivne , oslobađajući memoriju za druge procese. U desktop okruženjima ili aplikacijskim serverima, ovo može napraviti značajnu razliku.

I naravno, Cron je savršen za praćenje i evidentiranje skripti : redovno snimanje CPU-a, RAM-a, korištenja diska, latencije mreže itd., pohranjivanje u log datoteke, a zatim analiziranje trendova kako bi se otkrila uska grla prije nego što postanu ozbiljni incidenti.

Nedostaci i ograničenja Crona i Crontaba

Iako je Cron izuzetno moćan alat, nije savršeno rješenje za sve. Ima ograničenja kojih je važno biti svjestan kako se ne bi prekoračile njegove mogućnosti.

S jedne strane, tu je krivulja učenja . Ako dolazite iz grafičkijih okruženja ili sistema poput Windowsa, u početku može biti zastrašujuće pisati cron izraze ručno i raditi bez vizualnog interfejsa.

S druge strane, Cron je usko povezan s Unix/Linux ekosistemom. Ono što naučite bit će korisno na mnogim serverima i sličnim sistemima, ali ga nećete moći koristiti potpuno isto kao na Windowsu ili macOS-u (koji imaju svoje vlastite mehanizme).

Što se tiče sigurnosti, ako cron konfiguracijske datoteke nisu pravilno zaštićene , one mogu biti ulazna tačka za zlonamjerna izvršavanja. Dozvoljavanje bilo kojem korisniku da zakazuje stvari bez nadzora otvara vrata problemima.

Nadalje, Cron nije idealan za vrlo složene zadatke ili one s mnogo zavisnosti . Nedostaje mu napredno rukovanje greškama, ne može ponovo pokušati s uvjetnom logikom i ne integrira se izvorno s distribuiranim sistemima. Za te zadatke dostupni su sofisticiraniji planeri ili vlastiti tajmeri systemd-a.

Također je važno napomenuti da crontab nudi samo preciznost od jedne minute . Ako vam je potrebno da se nešto izvršava više puta u sekundi ili u intervalima kraćim od jedne minute, morat ćete koristiti druge alate ili programske petlje unutar samog skripta.

Alternative za Cron i Crontab: Anacron, Fcron, hcron, Mcron i drugi

U nekim scenarijima, Cron nije idealan izbor. Na primjer, ako imate laptop ili server koji nije uvijek uključen, zadaci zakazani za određeno vrijeme mogu biti "izgubljeni" ako se računar u tom trenutku isključi.

Za takve slučajeve postoje alternative poput Anacrona , koji je dizajniran za izvršavanje ponavljajućih zadataka bez potrebe da mašina bude stalno uključena . Ako je računar bio isključen kada je zadatak trebao biti izvršen, Anacron će ga pokrenuti što je prije moguće nakon pokretanja.

Fcron je još jedna zanimljiva opcija. Ne zahtijeva da sistem bude stalno aktivan, može raditi s određenim datumima i vremenima i nudi veću fleksibilnost po cijenu ručne instalacije na mnogim distribucijama.

hcron ide korak dalje, omogućavajući korištenje oznaka za organiziranje poslova, upravljanje mrežama mašina i poboljšanje sigurnosti . Nije toliko popularan, ali može biti dobar izbor za okruženja gdje je poželjna centralizovana administracija.

Mcron (baziran na Guileu) se razlikuje po tome što se oslanja na kompletan programski jezik za definiranje raspoređivanja zadataka, što mu daje ogromnu moć kada je u pitanju redefiniranje poslova, kreiranje zavisnosti i rukovanje složenom logikom.

U Windowsu se umjesto Crona koriste rješenja poput WinCron-a, VisualCron-a ili Advanced Task Scheduler-a , koja pružaju intuitivne grafičke interfejse i slične funkcionalnosti, iako su integrirana s Microsoftovim ekosistemom.

Cron i Crontab u poslovnom okruženju

U kompanijama svih veličina, Cron i Crontab su dio "ljepila" koje održava sisteme u radu. Oni omogućavaju automatizaciju repetitivnih i kritičnih procesa bez stalne ljudske intervencije, smanjujući rizik od kvarova i oslobađajući vrijeme administratorima.

Uobičajene poslovne upotrebe uključuju planirane sigurnosne kopije, ažuriranja softvera, periodično generiranje izvještaja, održavanje baze podataka i čišćenje logova . Zahvaljujući detaljnoj sintaksi, možete precizno kontrolirati kada se ove radnje izvršavaju kako biste smanjili utjecaj.

Nadalje, ove automatizacije imaju direktan utjecaj na efikasnost i produktivnost . Zaposleni se ne moraju sjećati pokretanja rutinskih procesa, ljudske greške su smanjene, a prozori s niskim opterećenjem se bolje koriste za zahtjevne operacije.

Međutim, u poslovnim okruženjima, neophodno je temeljito dokumentirati sve planirane zadatke, održavati sigurnosne kopije crontabova i periodično provjeravati da li definirani zadaci i dalje imaju smisla . Vremenom je lako akumulirati zastarjele zadatke koji nastavljaju trošiti resurse bez ikakvog doprinosa.

Konačno, Cron i Crontab postaju svojevrsni "automatski planer" za sistem . Ako se koriste mudro, postaju nezamjenjivi i na skromnim serverima i na velikim infrastrukturama s mnogo mašina, omogućavajući vam održavanje čvrste osnove na kojoj možete graditi druge, naprednije alate za orkestraciju ili praćenje.

S obzirom na sve navedeno, jasno je da zakazivanje zadataka u Linuxu pomoću Crontaba ostaje jedan od najjednostavnijih i najmoćnijih načina za automatizaciju vašeg sistema : s nekoliko dobro napisanih redaka možete se pobrinuti za sigurnosne kopije, čišćenje, ažuriranja, praćenje i poslovne procese bez dodirivanja dugmeta, sve dok poštujete njegova ograničenja, vodite računa o dozvolama, kontrolirate okruženje i razumno planirate utjecaj na performanse i sigurnost.

automatska sigurnosna kopija na eksterne diskove
Vezani članak:
Automatska sigurnosna kopija: Zaštitite svoje podatke na eksternim diskovima

Dodaj kao preferirani izvor na Googleu