Planlegg én gang-jobber i Linux: Bruk `at` og `batch`!

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 , som betyr slutten av overføringen. Jobbnummeret og kjøretiden vil vises:

Etter at jobben er utført, sjekk intern e-post med:

mail

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:

mail

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 minutes 
   

Fjerne planlagte jobber

Bruk kommandoen 'atrm' for å fjerne en planlagt jobb fra køen. Finn jobbnummeret med 'atq', og bruk det med 'atrm', som vist:

atq
atrm 11
atq

Detaljert oversikt over jobber

Dersom du trenger detaljert informasjon om en jobb, kan du bruke '-c'-alternativet med 'at'.

Finn først jobbnummeret med 'atq':

atq

Bruk deretter jobbnummeret med '-c':

at -c 13

Her 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:

batch

Legg 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.deny

Filen 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.allow

I 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:

at

Han 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.