systemd

Next Generation Cron With systemd Skapa en timer

Next Generation Cron With systemd Skapa en timer
Behöver du planera en uppgift i framtiden på din dator? Det här kan se enkelt ut - trots allt kan din diskmaskin vänta innan den startas med hjälp av en knapp - men ibland gör datorer så enkla uppgifter så hård.Men om du har lite bakgrund har du förmodligen hört talas om cron, denna mjukvara helt dedikerad för att starta rätt uppgift vid rätt tidpunkt. Men det här verktyget har verkligen utformats med tanke på enkelhet och du kan i slutändan få dåliga överraskningar.Om du någonsin lyckats planera en uppgift i Windows har du använt Windows Aktivitetsplanerare. Det har en GUI som standard men det gör det inte så enkelt att använda också: dessa två system startar bara en process vid en fast tid och ett datum.

För att förstå hur systemd kan vara till hjälp för dig där tar jag ett exempel.

Vilka fallgropar systemtimers kommer att undvika dig?

Om du någonsin äger en maskin med data du bryr dig om, vill du ha en kopia av dina data på en annan, förmodligen säkrare plats. Om du hanterar en server är det obligatoriskt: när allt kommer omkring, hur kommer du att återställa om din hårddisk misslyckas och hindrar dig från att återställa data?

Så som en ansvarsfull person ställer du in backup varje vecka eller varje dag. Du kan ställa in det med hjälp av cron, du schemalägger det klockan 04:24, men här börjar problemet: vad händer om din server stängs av klockan 04:10 till 04:30 av någon anledning?

Det är troligt att cron bara hoppar över den säkerhetskopian. Detta kan vara avgörande om det händer ofta och tyst eller om din kod förlitar sig på att den körs och den kan misslyckas på annat sätt. Generellt händer detta när du ställer in en rengöringsuppgift via cron och den startar inte. Plötsligt kan din kod ha inte tillräckligt med utrymme för att fortsätta och kommer att gå sönder - det är sorgligt, så sorgligt, rätt Elton John.

Men om en missad lansering kan vara ett problem, tänk dig en sekund - wow, John Lennon nu? - att din uppgift går för mycket långsamt. Om din uppgift är inställd på att köras var 10: e minut men tar 15 minuter att slutföra, kommer cron eller Windows med glädje att starta en annan uppgift även om den aktuella uppgiften inte är borta än - och så har du två instanser av din uppgift som körs samtidigt , vilken är perfekt recept för katastrof. När ett program körs samtidigt som det inte är utformat för att göra det, kommer det sannolikt att skada filer, andra program, databaser - och din server blir plötsligt ett sjunkande fartyg som Titanic.

Okej, jag går kanske för långt med Titanic men du får idén. Systemd kunde inte ha gjort mycket för att rädda detta fartyg, men det kan hjälpa dig med alla dessa brister och säkerställa en längre julsemester tack vare buggarna som det kommer att undvika dig. Det är dags nu att lära känna hur man ställer in systemtimers.

Hur man schemalägger automatisk serverbackup?

Först och främst utlöser systemd-tidtagare en systemd-tjänst, så innan du schemalägger din uppgift måste du först göra den till en tjänst. Lyckligtvis har jag skrivit en guide för att skapa systemd-tjänst, på det här sättet kommer det att presentera dig för systemds sätt att arbeta. Du bör läsa den innan du fortsätter. Om inte du exakt vet vad du gör, bör din systemd-servicefil inte innehålla någon WantedBy = -inställning. Om du vill starta din tjänst vid en viss tidpunkt vill du förmodligen inte starta den vid start.

Tack vare systemd-servicesystemet är det omöjligt att ha flera instanser av att din uppgift körs av misstag: om en uppgift redan körs hoppar den bara över start och låter den aktuella uppgiften avsluta sitt jobb.

När du har en systemd-tjänst att schemalägga skapar du en fil med samma filnamn som din tjänst förutom att den ska sluta med .timer istället för .service. I vårt exempel på automatiserad säkerhetskopiering skulle tjänsten vara automatisk säkerhetskopiering.tjänsten och timern skulle vara automatisk säkerhetskopiering.timer. Båda filerna ska finnas i samma katalog. Som jag sa till dig i artikeln om systemtjänst rekommenderar jag att du skriver dessa filer på en normal plats som i din hemkatalog och sedan kopierar dem till en systemmapp när du har avslutat dina redigeringar.

Så, låt mig visa dig hur vår timerfil ser ut:

[Enhet]
Beskrivning = Schemalägg säkerhetskopior under lågtrafik
[Timer]
OnCalendar = * - * - * 03:00:00
RandomizedDelaySec = 7200
Ihållande = sant
[Installera]
WantedBy = timers.mål

Precis som i systemd-tjänster finns det tre avsnitt. [Enhet] eller [Installera] fungerar exakt samma som förklaras i min artikel om systemtjänster. Observera att WantedBy = är viktigt här eftersom timers kan startas eller stoppas, så om du inte säger till systemd att starta din timer under start kommer den aldrig att utlösas. timers.mål är ett speciellt systemmål för timers.

Nu, avsnittet [Timer]. Inuti den hittar du alla inställningar relaterade till när timern ska utlösas. För vår automatiska säkerhetskopia har jag sagt systemd att köra den mellan 3 AM och 5 AM vid serverns tidszon. Den exakta tiden är slumpmässig varje dag.

OnCalendar = ställer in timern som är relaterad till din servers tid (väggklocka), till exempel varje söndag kl. 13.00. Om du har använt cron tidigare bör du känna till denna syntax. Men det har några extra fördelar.

Om du till exempel vill att något ska hända varje timme kan du göra så här:

OnCalendar = timme

och dagligen:

OnCalendar = dagligen

Faktum är att den stöder alla följande värden:

  1. minutiöst
  2. varje timme
  3. dagligen
  4. en gång i månaden
  5. varje vecka
  6. årlig
  7. kvartals
  8. halvårsvis

Det finns dock ett problem med dessa nyckelord: till exempel utlöser dagligen alltid en midnatt, vilket ofta är en topptid i datorsystem. Det är därför det rekommenderas att använda RandomizedDelaySec = (dess användning anges nedan). Hur som helst för säkerhetskopiering är det inte ett bra alternativ: midnatt är inte utanför topptid, det är snarare tvärtom. Så vi måste ställa in mer exakt när vi vill se att uppgiften startas.

Om du vill ha mer kontroll kan du skriva ett datum som 2018-12-06 12:49:37. Om du är så specifik kommer du bara att utlösa timern en gång. För att göra det återkommande ersätter du något av dessa element med * asterisk.

OnCalendar = * - * - * 03:00:00

Som du kan se ovan, i vårt säkerhetskopieexempel, är hela datumdelen * - * - *, vilket betyder att den ska inträffa varje dag i varje månad varje år. Nu om du gör det:

OnCalendar = * - 12-25 03:00:00

Sedan går den var 25: e december klockan 3. Perfekt systemtimer för jultomten - även om jag tvivlar på att han någonsin kommer att behöva en! Så asterisk lägger till återfall där du lägger den. Om du lägger in det i år fält, betyder det "varje år", etc.

Slutligen kan du lägga till UTC i slutet av raden för att använda UTC-tid istället för lokal tidszon. Till exempel återställer vissa tjänster sina API-kvoter vid midnatt, men för att undvika tidszonsförskjutning använder den UTC. Så för sådana uppgifter skulle du göra:

OnCalendar = daglig UTC

Låt oss nu lösa ett annat problem: rusningstid. systemd har också en inställning för att bekämpa det.

RandomizedDelaySec = gör det möjligt att fördröja uppgiften slumpmässigt. Värdet är det maximala antalet sekunder som timern fördröjer. Den är speciellt avsedd för sådana fall. Du kommer ihåg att i systemd utlöses dagligen alltid vid midnatt? Tja, varje vecka utlöses alltid vid måndag midnatt och årliga utlösare vid 1 januari midnatt, en av de värsta topparna på året med nätverksavbrott överallt. Du vill verkligen inte att det ska hända.

Genom att lägga till en fördröjning tar du bort problemet: det fördröjer automatiskt din uppgift vid en okänd tidpunkt. Slumpmässighet här är viktig eftersom det är mycket mer troligt att det är även när det är slumpmässigt och en jämn belastning gör det möjligt att bättre optimera dina uppgifter.

Säg att du måste köra dina uppgifter runt 7 på morgonen men du vill tillåta en liten fördröjning på max 15 minuter, du skulle vilja göra så här:

RandomizedDelaySec = 900

Det borde vara tillräckligt för förseningar. Ibland är till och med millisekunder förseningar tillräckliga för att förhindra oavsiktliga spikar.

Persistent = tar hand om missade timerutlösare. Vad händer om din server stängs av på natten? Tja, säkerhetskopian skulle aldrig utlösas alls. Om du ställer in den till sant kan systemet köra den vid nästa start i sådana fall. På det här sättet vet du på ett eller annat sätt att timerns uppgift körs. Dess användning är enkel, du gör bara detta:

Ihållande = sant

Detta har dock en nackdel som det är riktigt svårt att undvika ändå: när flera uppgifter från olika timers saknas, kommer de alla att köras vid start och sakta ner den boot. Enligt min mening är det mycket bättre än om det aldrig går och trots allt är det normalt, det lämpligaste ögonblicket att köra timern är när den är schemalagd, efteråt kommer det antagligen att vara olämpligt ändå.

OnBootSec = är det sista alternativet som jag visar dig (men inte minst). Det är om du vill utlösa en timer någon gång efter start istället för baserat på kalender. Om du till exempel behöver kontrollera vid start om din server startas ordentligt och fungerar som avsett, kan du skriva en checktjänst och använda den timerinställningen för att utlösa den efter att systemet hade tillräckligt med tid att starta.

Låt oss säga att systemet behöver 3 minuter för att starta, du kan göra:

OnBootSec = 180

Och trots sitt namn kan du också göra:

OnBootSec = 3 minuter

Om du preciserar både OnBootSec = och OnCalendar =, kommer den att starta tjänsten när någon av dessa två händelser inträffar.

Okej, nu är det dags att spara filen, kopiera den till systemmappen om du följde mitt råd ovan och testa om din timer fungerar som den ska.

Aktivera din nya timer och övervakning

För att testa din nya timer måste du berätta för systemd att du har lagt till en ny timer, så du måste skriva detta kommando:

$ sudo systemctl daemon-reload

Nu tar systemd hänsyn till din nya timer och tittar noga på när du ska utföra din uppgift. Eftersom systemd alltid körs är det trots allt en av de bästa kandidaterna för att hantera och köra dina schemalagda uppgifter.

En sak som du kanske tycker är kontraintuitiv: en timer är som standard inaktiverad. För att aktivera det måste du göra det här kommandot:

$ sudo systemctl aktivera - nu automatiskt säkerhetskopiering.timer

Du kommer förmodligen vilja se om din timer fungerar som förväntat. Goda nyheter: systemd är till och med snäll att ha ett kommando som berättar när det senast lanserades och när nästa lansering är planerad (förutom om timern är inställd på att bara köras vid start, eftersom systemd inte vet när systemet startar uppenbarligen). Här är det kommandot:

$ systemctl status automatiskt säkerhetskopiering.timer

Slutligen, när du inte längre behöver timern, kan du också inaktivera den:

$ sudo systemctl inaktivera - nu automatiskt säkerhetskopiering.timer

Slutsats

Med systemtimers kommer din hantering av schemalagda uppgifter till en nästa nivå: ärligt talat känner jag personligen att schemalagda uppgifter borde ha varit så sedan flera år.

Åh, en liten överraskning för dig: alla systemtimers är inloggade i ett välstrukturerat system med filtrering, loggrotation och liknande. Så jag uppmanar dig att se hur du kan se loggar om dina schemalagda uppgifter!

Hur man använder GameConqueror Cheat Engine i Linux
Artikeln täcker en guide om hur du använder GameConqueror-fuskmotorn i Linux. Många användare som spelar spel på Windows använder ofta applikationen "...
Bästa spelkonsolemulatorer för Linux
Den här artikeln listar populära spelkonsolemuleringsprogram som finns tillgängliga för Linux. Emulation är ett mjukvarukompatibilitetsskikt som emule...
Bästa Linux Distros för spel 2021
Linux-operativsystemet har kommit långt från sitt ursprungliga, enkla, serverbaserade utseende. Detta operativsystem har förbättrats enormt de senaste...