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

Schemalägg enstaka uppgifter i Linux med ’at’ och ’batch’

Om du behöver planera ett jobb i Linux som endast ska köras vid ett enda tillfälle, är cron inte det bästa valet. Istället är det kommandofamiljen ’at’ som är verktyget för dig. Om du dessutom vill att processer ska köras endast när systemet har tillräckligt med lediga resurser, kan du dra nytta av kommandot ’batch’.

Planera Linuxjobb

Cron-demonen upprätthåller en lista över jobb som körs vid bestämda tider. Dessa uppgifter och skript körs i bakgrunden enligt det fastställda schemat. Det ger dig stor möjlighet att organisera återkommande uppgifter. Oavsett om du vill köra något varje timme, en viss tid varje dag, eller en gång i månaden eller året, kan det enkelt konfigureras i cron.

Däremot är cron inte idealisk för schemaläggning av enstaka uppgifter. Visst, det går att konfigurera dem i cron, men då måste du också komma ihåg att ta bort crontab-posten efter att uppgiften har slutförts, vilket är opraktiskt.

I Linux, om du stöter på ett problem, kan du vara nästan säker på att någon annan också har haft samma utmaning. Lyckligtvis, eftersom Unix-liknande operativsystem har funnits länge, finns det en stor sannolikhet att någon redan har skapat en lösning på ditt problem.

För problemet med enstaka uppgifter finns det en lösning: kommandot ’at’.

Installera ’at’-kommandot

Vi behövde installera ’at’ i Ubuntu 18.04 och Manjaro 18.1.0 (det var redan förinstallerat i Fedora 31).

För att installera i Ubuntu, använd det här kommandot:

sudo apt-get install at

Efter installationen kan du starta ’at’-demonen med det här kommandot:

sudo systemctl enable --now atd.service

I Manjaro installerar du ’at’ med det här kommandot:

sudo pacman -Sy at

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

sudo systemctl enable --now atd.service

Oavsett distribution kan du använda det här kommandot för att verifiera att ’atd’-demonen körs:

ps -e | grep atd

Använda ’at’-kommandot interaktivt

För att använda ’at’ måste du ange ett datum och en tid när jobbet ska köras. Det finns stor flexibilitet i hur du anger dessa, vilket vi kommer att utforska mer i detalj senare i den här artikeln.

Även när vi använder ’at’ interaktivt måste datum och tid specificeras. Om du inte anger något på kommandoraden, eller om du anger något som inte är ett giltigt datum eller tid, returnerar ’at’ svaret ”Förvrängd tid”, som visas nedan:

at
at banana

Datum och tider kan anges både explicit och relativt. Om du till exempel vill att ett kommando ska köras om en minut, vet ’at’ vad ”nu” betyder, så du kan använda ”now” och lägga till en minut, som så:

at now + 1 minute

’at’ skriver ut ett meddelande och en prompt och väntar på att du ska ange de kommandon du vill schemalägga. Titta först på meddelandet, som syns nedan:

Meddelandet indikerar att en instans av ’sh’-skalet har startats, och kommandona kommer att köras i det. Dina kommandon kommer alltså inte att köras i Bash-skalet, som är kompatibelt med ’sh’, men har en mer omfattande uppsättning funktioner.

Om dina kommandon eller skript försöker använda en funktion eller möjlighet som Bash erbjuder, men som inte finns i ’sh’, kommer de att misslyckas.

Det är enkelt att testa om dina kommandon eller skript fungerar i ’sh’. Använd kommandot ’sh’ för att starta ett ’sh’-skal:

sh

Kommandotolken ändras till ett dollartecken ($), och du kan nu köra dina kommandon och bekräfta att de fungerar som avsett.

För att återgå till Bash-skalet, använd kommandot ’exit’:

exit

Du kommer inte att se standardutdata eller felmeddelanden från kommandona på skärmen. Detta beror på att ’sh’-skalet startar som en bakgrundsuppgift och körs utan något gränssnitt.

All utdata från kommandona, oavsett om den är bra eller dålig, skickas till dig via e-post. E-postmeddelandet skickas via det interna e-postsystemet till den användare som körde ’at’-kommandot. Det innebär att du behöver konfigurera och ställa in det interna e-postsystemet.

Många (de flesta) Linux-system har inte ett internt e-postsystem, eftersom det inte alltid behövs. De som gör det, använder vanligen system som sendmail eller postfix. Om ditt system saknar ett internt e-postsystem, kan du låta skript skriva till filer eller omdirigera utdata till filer för att spara loggar.

Om kommandot inte genererar någon standardutdata eller felmeddelanden, kommer du inte att få något e-postmeddelande. Många Linux-kommandon signalerar framgång genom tystnad, så i de flesta fall kommer du inte att få något e-postmeddelande.

Nu är det dags att skriva in ett kommando i ’at’. I det här exemplet använder vi ett litet skript som heter ’sweep.sh’, som tar bort filerna *.bak, *.tmp och *.o. Skriv sökvägen till kommandot, som visas nedan, och tryck på Enter.

En ny kommandotolk visas och du kan lägga till så många kommandon du behöver. Det är oftast smidigare att ha kommandona i ett separat skript och helt enkelt anropa det skriptet från ’at’.

Tryck på Ctrl+D när du är klar med att lägga till kommandon. ’at’ visar <EOT> som betyder slut på sändningen. Du kommer att få se jobbnumret och tidpunkten då jobbet är schemalagt att köras, som visas nedan:

När jobbet har körts, använd det här kommandot för att kontrollera din interna e-post:

mail

Om det inte finns något e-postmeddelande kan du anta att jobbet har slutförts. I det här fallet kan du naturligtvis verifiera att *.bak-, *.tmp- och *.o-filerna har raderats för att bekräfta att kommandot fungerade.

Använd det här kommandot för att köra hela processen igen:

at now + 1 minute

Efter en minut kontrollerar du din e-post igen med det här kommandot:

mail

Här har vi fått ett e-postmeddelande! För att läsa meddelande nummer ett, tryck på 1 och 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 vi hade tagit bort dem när vi körde skriptet tidigare.

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 gäller tidsformaten du kan använda med ’at’. Här är några exempel:

Kör klockan 11:00:

at 11:00 AM

Kör klockan 11:00 imorgon:

at 11:00 AM tomorrow

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

at 11:00 AM next week

Kör vid samma tidpunkt, samma dag, nästa vecka:

at next week

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

at 11:00 AM next fri

Kör vid samma tidpunkt nästa fredag:

at next fri

Kör klockan 11:00 på det här datumet, 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 samma tidpunkt imorgon:

at tomorrow

Kör vid samma tidpunkt på torsdag:

at thursday

Kör klockan 12:00:

at midnight

Kör klockan 12:00:

at noon

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

at teatime

Visa jobbkön

Du kan använda kommandot ’atq’ för att se kön med schemalagda jobb, som visas nedan.

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

Jobb-ID
Schemalagt datum
Schemalagd tid
Kön som jobbet finns i. Köerna är markerade med ”a”, ”b” och så vidare. Normala uppgifter som du schemalägger med ’at’ hamnar i kön ”a”, medan uppgifter som du schemalägger med ’batch’ (som vi går igenom senare i den här artikeln) hamnar i kön ”b.”
Den användare som schemalade jobbet.

Använda ’at’ direkt från kommandoraden

Du behöver inte använda ’at’ interaktivt. Du kan även använda det direkt från kommandoraden. Det gör det enklare att använda ’at’ i skript.

Du kan skicka kommandon till ’at’ på det här viset:

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

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

Använda ’at’ med kommandofiler

Du kan även lagra en sekvens av kommandon i en fil och sedan skicka den till ’at’. Det 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’:

at now + 5 minutes -f clean.txt

Du kan åstadkomma samma sak genom att omdirigera filen till ’at’:

at now + 5 minutes < clean.txt

Ta bort schemalagda jobb från kön

För att ta bort ett schemalagt jobb från kön, kan du använda kommandot ’atrm’. Om du vill se kön först för att hitta numret på det jobb du vill ta bort, kan du använda ’atq’. Använd sedan det jobbnumret med ’atrm’, som visas nedan:

atq
atrm 11
atq

Visa detaljerad information om jobb

Som vi har nämnt tidigare kan du schemalägga jobb långt in i framtiden. Ibland kan du glömma vad ett jobb egentligen ska göra. Kommandot ’atq’ visar jobben i kön, men inte vad de innehåller. Om du vill visa 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

Nu använder vi jobb nummer 13 med alternativet ’-c’:

at -c 13

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

Första raden: Det indikerar att kommandona kommer att köras i ’sh’-skalet.
Andra raden: Vi ser att kommandona kommer att köras med både ett användar- och grupp-ID på 1000. Det här är värdena för den användare som körde kommandot ’at’.
Tredje raden: Den person som kommer att ta emot e-postmeddelanden.
Fjärde raden: Användarmasken är 22. Det här är masken som används för att ställa in standardbehörigheterna för alla filer som skapas i den här ’sh’-sessionen. Masken subtraheras från 666, vilket ger oss 644 (den oktala motsvarigheten till rw-r–r–).
Återstående data: Största delen är miljövariabler.

Resultatet av ett test. Ett test som verifierar att körningskatalogen är tillgänglig. Om det inte går, inträffar ett fel och körningen av jobbet avbryts.
Kommandon som ska köras. Dessa visas och även innehållet i de skript som är schemalagda. Observera att även om skriptet i vårt exempel ovan skrevs för att köras i Bash, kommer det ändå att köras i ett ’sh’-skal.

’batch’-kommandot

Kommandot ’batch’ fungerar på ett liknande sätt som ’at’-kommandot, men med tre viktiga skillnader:

Du kan endast använda ’batch’-kommandot interaktivt.
Istället för att schemalägga jobb för att köras vid en specifik tid, läggs de i kön, och ’batch’-kommandot kör dem när systemets genomsnittliga belastning är lägre än 1,5.
På grund av det ovanstående anger du aldrig ett datum eller en tid när du använder ’batch’-kommandot.

När du använder ’batch’-kommandot anropar du det med dess namn, utan parametrar på kommandoraden, som så:

batch

Lägg sedan till uppgifter på samma sätt som du gör med kommandot ’at’.

Kontrollera åtkomst till ’at’-kommandot

Filerna ’at.allow’ och ’at.deny’ styr vem som kan använda kommandofamiljen ’at’. De här filerna finns i katalogen ’/etc’. Som standard finns endast filen ’at.deny’ och skapas när ’at’ installeras.

Så här fungerar de:

’at.deny’: Visar en lista över applikationer och enheter som inte får använda ’at’ för att schemalägga jobb.
’at.allow’: Visar en lista över de som kan använda ’at’ för att schemalägga jobb. Om filen ’at.allow’ inte finns, används bara filen ’at.deny’.

Som standard kan alla använda ’at’. Om du vill begränsa vem som får använda det, använder du filen ’at.allow’ för att lista de som har tillåtelse. Det är enklare än att lägga till alla som inte får använda ’at’ i filen ’at.deny’.

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

sudo less /etc/at.deny

Filen visar en lista över komponenter i operativsystemet som inte får använda ’at’. Många av dem är inte tillåtna av säkerhetsskäl, så du ska inte ta bort något från filen.

Nu ska vi redigera filen ’at.allow’. Vi lägger till ’dave’ och ’mary’, men ingen annan ska få använda ’at’.

Först skriver vi följande:

sudo gedit /etc/at.allow

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

Om någon annan försöker använda ’at’ kommer de att få ett meddelande om att de saknar behörighet. Anta till exempel att en användare vid namn ’eric’ skriver följande:

at

Han kommer att nekas tillträde, som visas nedan.

Observera att ’eric’ inte finns med i filen ’at.deny’. Så snart du lägger till någon i ’at.allow’-filen, kommer alla andra att nekas tillträde till ’at’.

Perfekt för enstaka händelser

Som du har sett är både ’at’ och ’batch’ idealiska för uppgifter som bara behöver köras vid ett enda tillfälle. Låt oss göra en snabb sammanfattning:

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