Hur man använder och batcherar på Linux för att schemalägga kommandon

Om du vill schemalägga ett Linux-jobb som bara kommer att hända en gång, är cron overkill. At-familjen av kommandon är vad du behöver! Och om du bara vill köra processer när ditt system har lediga resurser kan du använda batch.

Hur man schemalägger Linux-jobb

Cron-demonen upprätthåller en lista över jobb som den kör vid specifika tidpunkter. Dessa uppgifter och program körs i bakgrunden vid schemalagda tider. Detta ger dig stor flexibilitet för att schemalägga uppgifter som behöver upprepas. Oavsett om du behöver köra en uppgift en gång i timmen, vid en specifik tidpunkt varje dag, eller en gång i månaden eller året, kan du ställa in den i cron.

Detta hjälper dock inte om du vill schemalägga en uppgift att köras bara en gång. Visst, du kan ställa in den i cron, men då måste du komma ihåg att gå tillbaka och ta bort crontab-post efter att uppgiften har körts, vilket är obekvämt.

Med Linux, om du kämpar med ett problem, är det nästan en garanti för att någon annan också har kämpat med det. Lyckligtvis, eftersom Unix-liknande operativsystem har funnits så länge, finns det också en utmärkt chans att någon har skapat en lösning på ditt problem.

För problemet som beskrivs ovan har de, och det kallas på.

Installerar at Command

Vi var tvungna att installera på Ubuntu 18.04 och Manjaro 18.1.0 (det var redan installerat på Fedora 31).

För att installera på Ubuntu, använd detta kommando:

sudo apt-get install at

De

När installationen är klar kan du starta at-demonen med det här kommandot:

sudo systemctl enable --now atd.service

De

På Manjaro installerar du på med detta kommando:

sudo pacman -Sy at

De

När installationen är klar, skriv det här kommandot för att starta at-demonen:

sudo systemctl enable --now atd.service

De

På vilken distribution som helst kan du skriva det här kommandot för att se till att atd-demonen körs:

ps -e | grep atd

De

Hur man använder at-kommandot interaktivt

För att använda på måste du tilldela den ett datum och en tid för att köra. Det finns en stor flexibilitet i hur du kan skriva dessa, vilket vi tar upp senare i den här artikeln.

Men även om vi kommer att använda på interaktivt måste du ange datum och tid i förväg. Om du inte inkluderar något på kommandoraden, eller om du skriver något som inte är ett datum och en tid, svarar klockan med ”Förvrängd tid”, som visas nedan:

at
at banana

En felaktig användning av

Datum och tider kan vara explicita eller relativa. Låt oss till exempel säga att du vill att ett kommando ska köras om en minut. at vet vad ”nu” betyder, så du kan använda nu och lägga till en minut till det, som så:

at now + 1 minute

De

at skriver ut ett meddelande och en vid prompt och väntar på att du ska skriva de kommandon du vill schemalägga. Tänk först på meddelandet, som visas nedan:

De

Den talar om för dig vid lansering av en instans av sh-skalet och kommer kör kommandona i det. Dina kommandon kommer inte att köras i Bash-skalet, som är kompatibelt med sh-skalet men har en rikare funktionsuppsättning.

Om dina kommandon eller skript försöker använda en funktion eller anläggning som Bash tillhandahåller, men inte gör det, kommer de att misslyckas.

Det är lätt att testa om dina kommandon eller skript kommer att köras i sh. Använd kommandot sh för att starta ett sh-skal:

sh

De

Kommandotolken ändras till ett dollartecken ($), och du kan nu köra dina kommandon och verifiera att de fungerar korrekt.

För att återgå till Bash-skalet, skriv exit-kommandot:

exit

Du kommer inte att se några standardutdata eller felmeddelanden från kommandona. Detta beror på att sh-skalet startar som en bakgrundsuppgift och körs utan någon form av skärmgränssnitt.

Alla utdata från kommandona – bra eller dåliga – skickas till dig via e-post. Det skickas via det interna e-postsystemet till den som kör kommandot at. Det betyder att du måste ställa in och konfigurera det interna e-postsystemet.

Många (de flesta) Linux-system har inte ett internt e-postsystem eftersom det sällan finns ett behov av ett. De som vanligtvis använder ett system som skicka brev eller postfix. Om ditt system inte har ett internt e-postsystem kan du låta skript skriva till filer eller omdirigera utdata till filer för att lägga till loggning.

Om kommandot inte genererar några standardutdata eller felmeddelanden får du inget e-postmeddelande i alla fall. Många Linux-kommandon indikerar framgång via tystnad, så i de flesta fall får du inget e-postmeddelande.

Nu är det dags att skriva ett kommando i kl. För det här exemplet använder vi en liten skriptfil som heter sweep.sh som tar bort filerna *.bak, *.tmp och *.o. Skriv sökvägen till kommandot, som visas nedan, och tryck sedan på Retur.

De

En annan kommandotolk visas och du kan lägga till så många kommandon du vill. Det är vanligtvis bekvämare att ha dina kommandon i ett enda skript och helt enkelt anropa det skriptet inifrån kl.

Tryck på Ctrl+D för att se när du är klar med att lägga till kommandon. på utställningar som betyder slutet av sändningen. Du får veta jobbnumret och när jobbet är schemalagt att köras, enligt nedan:

Bekräftelse av

När jobbet har körts, skriv följande för att kontrollera din interna e-post:

mail

De

Om det inte finns någon e-post måste du anta framgång. Naturligtvis, i det här fallet, kan du kontrollera och se om *.bak-, *.tmp- och *.o-filerna raderades för att bekräfta att kommandot fungerade.

Skriv följande för att köra det hela igen:

at now + 1 minute

De

Efter en minut skriver du följande för att kontrollera din e-post igen:

mail

De

Hej, vi har mail! För att läsa meddelande nummer ett, tryck på 1 och tryck sedan på Enter.

Vi fick ett e-postmeddelande från at eftersom kommandona i skriptet genererade felmeddelanden. I det här exemplet fanns det inga filer att radera eftersom när vi körde skriptet tidigare tog det bort dem.

Tryck på D+Enter för att radera e-postmeddelandet och Q+Enter för att avsluta e-postprogrammet.

Datum- och tidsformat

Du har stor flexibilitet när det kommer till de tidsformat du kan använda med vid. Här är några exempel:

Kör kl 11:00:

at 11:00 AM

Spring kl 11:00 imorgon:

at 11:00 AM tomorrow

Kör klockan 11:00 denna dag nästa vecka:

at 11:00 AM next week

Kör vid den här tiden, denna dag, nästa vecka:

at next week

Kör klockan 11:00 nästa fredag:

at 11:00 AM next fri

Kör vid denna tid nästa fredag:

at next fri

Kör klockan 11:00 på detta datum, nästa månad:

at 11:00 AM next month

Kör klockan 11:00 på ett specifikt datum:

at 11:00 AM 3/15/2020

Kör 30 minuter från nu:

at now + 30 minutes

Kör två timmar från nu:

at now + 2 hours

Kör vid den här tiden imorgon:

at tomorrow

Kör vid den här tiden på torsdag:

at thursday

Kör kl 12:00:

at midnight

Kör kl 12:00:

at noon

Om du är en britt kan du till och med schemalägga ett kommando som ska köras vid tetid (16:00):

at teatime

Tittar på jobbkön

Du kan skriva kommandot atq för att se kön med schemalagda jobb, som visas nedan.

Utdata från

För varje kommando i kön visar atq följande information:

Jobb id
Schemalagt datum
Schemalagd tid
Kö jobbet är i. Köerna är märkta ”a”, ”b” och så vidare. Normala uppgifter du schemalägger med vid gå in i kö ”a”, medan uppgifter du schemalägger med batch (behandlas senare i den här artikeln) går i kö ”b.”
Personen som schemalagt jobbet.

Använder på på kommandoraden

Du behöver inte använda på interaktivt; du kan också använda den på kommandot. Detta gör det lättare att använda inuti skript.

Du kan skicka kommandon till på, så här:

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

En

Uppdraget accepteras och schemaläggs senast kl, och jobbnummer och utförandedatum rapporteras precis som tidigare.

Använda at med kommandofiler

Du kan också lagra en sekvens av kommandon i en fil och sedan skicka den till kl. Det här kan vara en vanlig textfil med kommandon – det behöver inte vara ett körbart skript.

Du kan använda alternativet -f (fil) på följande sätt för att skicka ett filnamn till:

at now + 5 minutes -f clean.txt

En

Du kan uppnå samma resultat om du omdirigerar filen till på:

at now + 5 minutes 

En

Removing Scheduled Jobs from the Queue

To remove a scheduled job from the queue, you can use the atrm command. If you want to see the queue first to find the number of the job you want to remove, you can use atq . Then, use that job number with atrm, as shown below:

atq
atrm 11
atq

Hur man ser en detaljerad vy av jobb

Som vi nämnde tidigare kan du schemalägga jobb långt in i framtiden. Ibland kan du glömma vad ett jobb kommer att göra. Kommandot atq visar dig jobben i kön, men inte vad de ska göra. Om du vill se en detaljerad vy av ett jobb kan du använda alternativet -c (cat).

Först använder vi atq för att hitta jobbnumret:

atq

Utdata från

Nu kommer vi att använda jobb nummer 13 med alternativet -c:

at -c 13

De

Här är en sammanfattning av den information vi får tillbaka om jobbet:

Första raden: Detta talar om för oss att kommandona kommer att köras under sh-skalet.
Andra raden: Vi ser att kommandona kommer att köras med både ett användar- och grupp-ID på 1000. Dessa är värdena för den person som körde at-kommandot.
Tredje raden: Personen som tar emot e-postmeddelanden kommer.
Fjärde raden: The Användarmask är 22. Detta är masken som används för att ställa in standardbehörigheterna för alla filer som skapas i denna sh-session. Masken subtraheras från 666, vilket ger oss 644 (den oktala motsvarigheten till rw-r--r--).
Återstående data: Majoriteten är miljövariabler.

Utdata från

Resultat av ett test. Ett test kontrollerar att körningskatalogen kan nås. Om det inte går, uppstår ett fel och utförandet av jobbet överges.
Kommandon som ska utföras. Dessa listas och innehållet i skripten som är schemalagda visas. Observera att även om skriptet i vårt exempel ovan skrevs för att köras under Bash, kommer det fortfarande att köras i ett sh-skal.

Batch-kommandot

Batch-kommandot fungerar på liknande sätt till kommandot, men med tre signifikanta skillnader:

Du kan bara använda batchkommandot interaktivt.
Istället för att schemalägga jobb att köra vid en specifik tidpunkt lägger du till dem i kön och batchkommandot kör dem när systemets genomsnittliga belastning är lägre än 1,5.
På grund av ovanstående anger du aldrig ett datum och en tid med batchkommandot.

När du använder batchkommandot kallar du det vid namn utan kommandoradsparametrar som så:

batch

De

Lägg sedan till uppgifter precis som du skulle med kommandot at.

Styr åtkomst till at Command

Filerna at.allow och at.deny styr vem som kan använda at-familjen av kommandon. Dessa finns i katalogen /etc. Som standard finns bara filen at.deny, och den skapas när at installeras.

Så här fungerar dessa:

at.deny: Listar applikationer och enheter som inte kan använda på för att schemalägga jobb.
at.allow: Listar vem som kan använda på för att schemalägga jobb. Om filen at.allow inte finns, använder at endast filen at.deny.

Som standard kan alla använda på. Om du vill begränsa vem som kan använda den, använd filen at.allow för att lista de som kan. Detta är enklare än att lägga till alla som inte kan använda at till filen at.deny.

Så här ser filen at.deny ut:

sudo less /etc/at.deny

De

Filen listar komponenter i operativsystemet som inte kan användas på. Många av dessa är förhindrade att göra det av säkerhetsskäl, så du vill inte ta bort någon från filen.

Nu ska vi redigera filen at.allow. Vi kommer att lägga till dave och mary, men ingen annan kommer att få använda kl.

Först skriver vi följande:

sudo gedit /etc/at.allow

De

I editorn lägger vi till de två namnen, som visas nedan, och sparar sedan filen.

Om någon annan försöker använda på, kommer han att få veta att han inte har tillstånd. Låt oss till exempel säga att en användare som heter eric skriver följande:

at

Han skulle nekas, som visas nedan.

Återigen, eric finns inte i filen at.deny. Så fort du lägger in någon i at.allow-filen nekas alla och alla andra tillstånd att använda på.

Perfekt för engångstillfällen

Som du kan se är både at och batch idealiska för uppgifter som du bara behöver köra en gång. Återigen, som en snabb recension:

När du behöver göra något som inte är en vanlig process, schemalägg det med kl.
Om du bara vill köra en uppgift när systembelastningen är tillräckligt låg, använd batch.