Planlegg engangsjobber i Linux med «at» og «batch»
Dersom du har behov for å planlegge en Linux-oppgave som kun skal utføres én gang, er cron et unødvendig verktøy. Her kommer «at»-kommandoene inn i bildet. Og dersom du ønsker at prosesser skal kjøres når systemet har ledige ressurser, er «batch» et ypperlig valg.
Håndtering av Linux-jobber
Cron-demonen vedlikeholder en oversikt over jobber som utføres på bestemte tidspunkt. Disse prosessene og programmene kjører i bakgrunnen frem til angitt tidspunkt. Dette gir fleksibilitet for gjentakende oppgaver, enten det er timevis, daglig, månedlig eller årlig. Cron håndterer dette smidig.
Men for oppgaver som kun skal kjøres en enkelt gang, blir cron upraktisk. Du kan selvsagt bruke cron, men da må du huske å fjerne crontab-oppføringen etterpå. Dette er ikke en ideell løsning.
I Linux-verdenen er det ofte slik at dersom du støter på et problem, er sjansen stor for at noen andre har opplevd det samme. Og siden Unix-lignende systemer har eksistert lenge, er det stor sannsynlighet for at det finnes en løsning. For engangsjobber heter den løsningen «at».
Installering av «at»-kommandoen
Ved testing ble det nødvendig å installere «at» på Ubuntu 18.04 og Manjaro 18.1.0, mens den var forhåndsinstallert i Fedora 31.
For å installere på Ubuntu, bruk følgende kommando:
sudo apt-get install at
Etter installasjonen, start «at»-demonen med denne kommandoen:
sudo systemctl enable --now atd.service
På Manjaro installeres «at» med denne kommandoen:
sudo pacman -Sy at
Etter installasjonen, start «at»-demonen med denne kommandoen:
sudo systemctl enable --now atd.service
For å sjekke om «atd»-demonen kjører, kan du bruke denne kommandoen:
ps -e | grep atd
Interaktiv bruk av «at»-kommandoen
For å bruke «at», må du angi tidspunktet for når kommandoen skal kjøres. Du har stor frihet i hvordan tidspunktet spesifiseres, noe vi ser nærmere på senere.
Selv ved interaktiv bruk, må tidspunktet angis på forhånd. Om tidspunktet mangler eller er feil, vil «at» svare med «Garbled time», som demonstrert nedenfor:
at
at banana
Datoer og klokkeslett kan være både eksplisitte og relative. For eksempel, for å utføre en kommando om ett minutt, bruker du «now + 1 minute»:
at now + 1 minute
Etter tidspunktsangivelsen får du en melding og en ledetekst, der du kan skrive inn kommandoene som skal planlegges. Merk meldingen, som vist under:
Den forteller deg at en forekomst av sh-skallet vil utføre kommandoene dine. Kommandoene dine kjøres ikke i Bash-skallet, som er kompatibelt med sh, men har et rikere sett med funksjoner.
Dersom dine kommandoer eller skript benytter Bash-spesifikke funksjoner som sh ikke støtter, vil de mislykkes.
Du kan enkelt teste om dine kommandoer fungerer i sh ved å starte et sh-skall:
sh
Ledeteksten endres til et dollartegn ($), og du kan teste kommandoene dine. For å gå tilbake til Bash-skallet, bruk «exit»:
exit
Utdata eller feilmeldinger fra kommandoene vil ikke vises i terminalen. Dette skyldes at sh-skallet kjører som en bakgrunnsprosess uten grensesnitt.
Eventuelle utdata, enten positive eller negative, sendes til deg per e-post. Dette sendes gjennom det interne postsystemet til den som kjørte «at»-kommandoen. Dette betyr at du må konfigurere det interne e-postsystemet.
De fleste Linux-systemer har ikke et internt e-postsystem da det sjelden er nødvendig. De som har, bruker systemer som sendmail eller postfix. Hvis systemet ditt ikke har e-post, kan du dirigere utdata til filer for logging.
Dersom en kommando ikke genererer utdata eller feilmeldinger, vil du heller ikke motta e-post. Mange Linux-kommandoer signaliserer suksess ved å ikke generere noen utdata, så ofte vil du ikke motta e-post.
La oss bruke en skriptfil ved navn «sweep.sh», som sletter *.bak-, *.tmp- og *.o-filer. Skriv inn banen til skriptet, og trykk Enter.
En ny ledetekst vises, og du kan legge til flere kommandoer. Det er ofte mer praktisk å samle kommandoene i ett skript.
Trykk Ctrl+D når du er ferdig med å legge til kommandoer. «at» viser
Etter at jobben er utført, sjekk intern e-post med:
Dersom ingen e-post er mottatt, kan du anta at jobben var vellykket. Du kan også sjekke om *.bak-, *.tmp- og *.o-filene faktisk ble slettet.
La oss gjenta prosessen:
at now + 1 minute
Etter ett minutt, sjekk e-posten igjen:
Vi har e-post! For å lese melding nummer 1, skriv 1 og trykk Enter.
Vi mottok e-post fordi skriptet genererte feilmeldinger. Dette skyldes at filene vi prøvde å slette, allerede var slettet.
Trykk D+Enter for å slette e-posten og Q+Enter for å avslutte e-postprogrammet.
Tidsformater i «at»-kommandoen
Du har stor fleksibilitet i tidsformatene du kan bruke med «at». Her er noen eksempler:
Kjør kl. 11:00:
at 11:00 AM
Kjør kl. 11:00 i morgen:
at 11:00 AM tomorrow
Kjør kl. 11:00 samme dag neste uke:
at 11:00 AM next week
Kjør på dette tidspunktet, samme dag neste uke:
at next week
Kjør kl. 11:00 neste fredag:
at 11:00 AM next fri
Kjør på dette tidspunktet neste fredag:
at next fri
Kjør kl. 11:00 samme dato neste måned:
at 11:00 AM next month
Kjør kl. 11:00 på en bestemt dato:
at 11:00 AM 3/15/2020
Kjør 30 minutter fra nå:
at now + 30 minutes
Kjør to timer fra nå:
at now + 2 hours
Kjør på denne tiden i morgen:
at tomorrow
Kjør på denne tiden på torsdag:
at thursday
Kjør kl. 12:00:
at midnight
Kjør kl. 12:00:
at noon
Og for britene: planlegg ved tetid (16:00):
at teatime
Jobbkøen
Kommandoen «atq» viser deg jobbkøen:
For hver jobb vises:
Jobb-ID
Planlagt dato
Planlagt tid
Køen jobben er i. Vanlige «at»-jobber går i kø «a», mens «batch»-jobber havner i kø «b»
Brukeren som planla jobben.
Bruk «at» fra kommandolinjen
«at» kan også brukes fra kommandolinjen, noe som forenkler bruken i skript.
Du kan overføre kommandoer til «at» på denne måten:
echo "sh ~/sweep.sh" | at 08:45 AM
Jobben aksepteres, og jobbnummer og kjøretidspunkt vises.
Bruk av kommandofiler med «at»
Du kan også lagre en sekvens av kommandoer i en fil, og sende den til «at». Dette trenger ikke være et kjørbart skript, bare en tekstfil med kommandoer.
Bruk «-f»-alternativet for å sende et filnavn til «at»:
at now + 5 minutes -f clean.txt
Du kan oppnå samme resultat ved å omdirigere filen til «at»:
at now + 5 minutesFjerne planlagte jobber
Bruk kommandoen 'atrm' for å fjerne en planlagt jobb fra køen. Finn jobbnummeret med 'atq', og bruk det med 'atrm', som vist:
atqatrm 11atqDetaljert oversikt over jobber
Dersom du trenger detaljert informasjon om en jobb, kan du bruke '-c'-alternativet med 'at'.
Finn først jobbnummeret med 'atq':
atqBruk deretter jobbnummeret med '-c':
at -c 13Her er en forklaring av informasjonen vi mottar:
Første linje: Kommandoene kjøres i sh-skallet.
Andre linje: Kommandoene kjøres med bruker- og gruppe-ID 1000. Dette er ID-ene til den som kjørte 'at'-kommandoen.
Tredje linje: E-postmottaker.
Fjerde linje: Brukermasken er 22. Den brukes for å sette standardtillatelser for filer som opprettes i sh-økten. Masken trekkes fra 666, som gir 644 (rw-r--r--).
Resten: Miljøvariabler.Testresultat som sjekker at utførelseskatalogen er tilgjengelig. Hvis ikke, avbrytes jobben.
Kommandoene som skal kjøres og innholdet i skriptene som er planlagt. Merk at selv om skriptet ble skrevet for Bash, vil det utføres i et sh-skall.'Batch'-kommandoen
Kommandoen 'batch' fungerer på lignende måte som 'at', men med tre viktige forskjeller:
'batch'-kommandoen brukes kun interaktivt.
Jobber settes i kø og utføres når systemets gjennomsnittlige belastning er under 1,5.
Du angir aldri tidspunktet når du bruker 'batch'.Når du bruker 'batch', skriver du kommandoen uten parametere:
batchLegg til oppgaver på samme måte som med 'at'-kommandoen.
Kontroll av tilgang til 'at'-kommandoen
Filene 'at.allow' og 'at.deny' i /etc-katalogen styrer hvem som kan bruke 'at'-kommandoene. Som standard finnes kun 'at.deny' etter installasjon.
Slik fungerer disse:
'at.deny': Viser brukere og prosesser som ikke kan bruke 'at'.
'at.allow': Viser hvem som kan bruke 'at'. Hvis 'at.allow' ikke eksisterer, brukes kun 'at.deny'.Som standard kan alle bruke 'at'. For å begrense tilgangen, kan du bruke 'at.allow' for å liste opp de som har lov. Dette er enklere enn å legge til alle som ikke skal bruke 'at' i 'at.deny'.
Slik ser standardinnholdet i 'at.deny'-filen ut:
sudo less /etc/at.denyFilen viser systemkomponenter som ikke har tillatelse til å bruke 'at'. Disse er sperret av sikkerhetsgrunner, så du bør ikke fjerne noen fra filen.
La oss redigere 'at.allow'-filen. Vi vil legge til 'dave' og 'mary', og dermed nekte alle andre tilgang.
Først kjører vi:
sudo gedit /etc/at.allowI redigeringsprogrammet legger vi til navnene, og lagrer filen.
Hvis en annen bruker prøver å bruke 'at', vil han få beskjed om at han ikke har tillatelse. La oss si at brukeren 'eric' prøver dette:
atHan vil bli nektet tilgang:
Merk at 'eric' ikke er i 'at.deny'-filen. Når du legger til brukere i 'at.allow', nektes alle andre tilgang.
Ideelt for engangsjobber
Som du ser, er både 'at' og 'batch' ideelle for oppgaver som kun skal kjøres én gang:
Bruk 'at' for engangsjobber som ikke er vanlige prosesser.
Bruk 'batch' for å utføre oppgaver når systembelastningen er lav.