Slazdi: padariet savus bash skriptus stabilākus

Sērfojot nacionālajā tīklā, es sastapos ar interesants raksts (ko es šeit atvedu tekstuāli, jo tas ir meistarīgi izskaidrots), kur tā autors parāda, kā padarīt mūsu Bash skriptus stabilākus, izmantojot Slazdi.

Padariet savus bash skriptus stabilākus, izmantojot slazdus

Iedomājieties, ka jums ir bash skripts, kas darbojas katru dienu ik pēc sešām stundām un ka kādā brīdī tas avarē vai tas pats skripts darbojas divas reizes vienlaicīgi. Šīs divas situācijas ir diezgan neērtas, jo tām ir jālabo cilvēka iejaukšanās vai arī noteiktā laikā tās nav iespējams novērst, atstājot sistēmu pretrunīgā stāvoklī. Risinājums tam, cita starpā, ir slazdu izmantošana.

Slazdi ir vienkāršs un efektīvs veids, kā kontrolēt bash skriptu izvadi. Atgriezīsimies tajā pašā sākotnējā situācijā, ja skripts tiek manuāli apturēts, piemēram, ar ctrl-c, tas tiek pārtraukts, atgriežot izejas signālu

INT

un ja tas beidzas ar

kill

tad produkcija būtu

TERM.

Visus iespējamos izejas kodus var apskatīt, izmantojot

kill -l

tomēr visbiežāk tiek izmantoti tieši

INT, TERM, EXIT

Ja skripts sastāv, piemēram, no failu sinhronizācijas ar

rsync

saprātīgākais ir paļauties uz bloķēšanas failu, kas neļauj skriptam darboties vienlaicīgi:

LOCK = "/ var / run / rsync.lock" ja [! -e $ LOCK]; tad pieskaries $ LOCK rsync -avz foo bar rm $ LOCK else echo "rsync jau darbojas" fi

Vienkāršā spāņu valodā iepriekšējais skripts pārbauda, ​​vai bloķēšanas fails pastāv, un, ja tāda nav, tas to izveido un vēlāk izpilda atbilstošo komandu, beidzot izdzēšot bloķēšanas failu. Ja fails pastāv, skripts vienkārši nosūta lietotājam ziņojumu, kurā norādīts, ka komanda jau darbojas.

Tomēr, ja ir problemātiska situācija, var gadīties, ka bloķēšanas fails netiek likvidēts, sabojājot nevēlamus efektus. Risinājums ir ļoti vienkāršs:

LOCK = "/ var / run / rsync.lock" ja [! -e $ LOCK]; tad slazds "rm -f $ LOCK; iziet" INT TERM EXIT pieskarieties $ LOCK rsync -avz foo bar rm $ LOCK slazds - INT TERM EXIT cits atbalss "rsync jau darbojas" fi

Šī risinājuma īpatnība ir tāda, ka komanda ir ieslēgta slazdā tā, ka, saņemot signālu

INT, TERM, EXIT

skripts apstājas un notīra bloķēšanas failu.

Ir vērts teikt, ka starp bloķēšanas faila pārbaudi un izveidošanas laiku augšējā skriptā varētu būt konkurences situācija. Viens iespējamais risinājums būtu novirzīšanas un bash noklobera režīma izmantošana, kas nenovirza uz esošu failu:

LOCK = "/ var / run / rsync.lock" if (iestatiet -o noclobber; echo $$> "$ LOCK") 2> / dev / null; tad slazds 'rm -f "$ LOCK"; iziet no $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT else echo "rsync jau darbojas: $ (cat $ LCK)" fi

Pēdējā īpatnība ir tā, ka to izmanto, kā jau teicu, noklobera režīmu un bloķēšanas failā ir izpildāmā procesa PID.

Ir arī vērts pieminēt, ka ir arī citi risinājumi, piemēram,

flock

o

solo

tomēr šajā ierakstā es vēlējos dalīties risinājumos ar paša Bash resursiem. Izmantojot šo, jūs varat uzzināt nedaudz vairāk par slazdiem lielisks ceļvedis.


Atstājiet savu komentāru

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti ar *

*

*

  1. Atbildīgais par datiem: Migels Ángels Gatóns
  2. Datu mērķis: SPAM kontrole, komentāru pārvaldība.
  3. Legitimācija: jūsu piekrišana
  4. Datu paziņošana: Dati netiks paziņoti trešām personām, izņemot juridiskus pienākumus.
  5. Datu glabāšana: datu bāze, ko mitina Occentus Networks (ES)
  6. Tiesības: jebkurā laikā varat ierobežot, atjaunot un dzēst savu informāciju.

  1.   Rafaels Kastro teica

    Lieliski! Paldies par dalīšanos.

  2.   nx teica

    Jauks raksts, vienkārši mainiet 'echo "rsync jau darbojas: $ (cat $ LCK)"' uz 'echo "rsync jau darbojas: $ (cat $ LOCK)"'

    Sveicieni

  3.   dglangos teica

    Ļoti interesants raksts, jā, kungs! To es paturu.

  4.   Joaquin teica

    Tā ir ļoti noderīga komanda, kas jāpatur prātā. Es to izmantoju skriptā, kuru publicēju ziņā, lai izdzēstu dažus failus, kurus skripts izveidoja, kad tas tika apturēts.

  5.   DaniFP teica

    Ļoti interesanti, jā, kungs.