Bash automatizálás és szkriptek alapjai (3. rész) – CloudSavvy IT

Avatar Gadam | 2021.02.23. 71 Views 0 Likes 0 Ratings

71 Views 0 Ratings Rate it

[ad_1]

Shutterstock / Mopic

A Bash automatizálás és a szkriptek készítésének alapjait tartalmazó három részünk utolsó cikkében a szkriptek hibakeresését, a szkriptek háttérfolyamatként történő futtatását és a többi parancsfájl importálását vizsgáljuk a forrás parancs segítségével.

Bash automatizálás és szkriptek alapjai

Ha szeretné kezdeni az elején, kérjük, olvassa el a mi oldalunkat Bash automatizálás és szkriptek alapjai 1. rész cikk. A Bash automatizálásáról és a szkriptek alapjairól szóló háromrészes sorozatunk utolsó cikke a futó szkripteket háttérfolyamatként fogja vizsgálni.

A szkriptjeinket is szeretnénk gyorsan hibakeresni, minimális felhajtás és csúcskategóriás eredmények mellett. Ez egy nagyon praktikus nyomkövetési funkcióval történhet, közvetlenül a Bash parancsértelmezőbe építve. Ezt megvizsgáljuk a második témában. Érdemes figyelnie a kapcsolódó shellcheckről szóló következő cikkünket is.

És végül meg fogjuk vizsgálni, hogyan lehet futtatni a szkripteket háttérfolyamatként. Bár ez szerény azonnali előnyökkel járhat – például több feladat egyszerre történő elindítása, ugyanakkor a későbbi fejlettebb, több szálú szkriptek számára is megalapozza a munkát.

A szkript hibakeresése

A szkript hibakeresése a Bash-ban nem feltétlenül nehéz! Figyelje a CloudSavvyIT webhelyét, amint áttekintjük a Bash átfogóbb shellcheck hibakereső eszközét, de jelenleg szeretném bemutatni Önnek a Shell szkriptek egyszerű és könnyen érthető módon történő hibakeresésének nagyszerű módját.

A Bash-héjon belül, amely végül is a „egyszerű” bináris fut a gépeden – mégpedig a bash bináris, van egy lehetőség (-x) ami szerint man bash (ennek végrehajtása a terminálon megjeleníti a Bash kézikönyvet) a következőképpen van leírva Nyomtassa ki a parancsokat és argumentumaikat végrehajtásuk közben, és ez pontosan ez! Hogyan segít ez a hibakeresésben? Vessen egy pillantást a következő példára:

#!/bin/bash

A=1
B=2
if [ "${AA}" == "1" -o "${B}" == "1" ]; then 
  echo "One ('1') was definitely stored in either the variable A, or the variable B"
  exit 0
else
  echo "Assert: could not locate the value '1' in the variables A and B"
  exit 1
fi

Egy kis Bash szkript hibával

Itt ellenőrizzük a változókat A és B az értékkel szemben 1. A -o szólás a if állítás áll OR, azaz vagy az első rész (A, vagy inkább AA itt van 1) igaz, vagy a második rész (B van 1) igaz, és ebben az esetben siker érhető el.

A szkript kimenete a programozott állítás lesz, és a program a következő kilépési kóddal fejeződik be 1, ami általában azt jelenti, hogy történt valami hiba. Ha a szkript helyesen működött, megerősítő üzenet jelenik meg, és a szkript a következő kilépési kóddal fejeződik be 0, ami általában azt jelenti, hogy a parancsfájlnak vagy a segédprogramnak bármi is volt a célja.

Tehát miért fut be a szkript az állításba? Lehet, hogy már észrevette, hogy a változó A tipusba ütközött a mi if nyilatkozat, a kódban mint AA: egy bogár! Mehetnénk ellenőrizni a szkriptet, és ha olyan rövid és egyértelmű, mint az itt bemutatott szkript, akkor a hibát gyorsan megtalálják. De egy 5000 soros program esetében a megoldás nem ilyen egyszerű, különösen akkor, ha több szálat, összetett alhéjat stb.

Debugáljuk ezt most a -x opciót a Bash-re. A Bash automatizálási és szkriptelési alapok tanfolyamunk második részéből emlékezhet arra, hogy egy alhéj elindítható inline használatával $( ... ) idiómák halmaza. Egyszerű gépeléssel is kezdeményezhető bash, vagy ebben az esetben bash -x a felső héjunkon belül. Ebben az esetben a szkriptet a Bash alhéjon belül futtatjuk, a -x lehetőség a lépésről lépésre történő megfigyelésre.

A kisparancsfájl futtatása a bash -x paranccsal

Így kivégeztük bash -x ./test_debugging.sh és figyelje meg, hogy a következő feltételes ellenőrzést végezzék: '[' '' == 1 -o 2 == 1 ']'. Észrevesszük, hogy valami nincs rendben: értéke 2 összehasonlítják a 1 feltételes ellenőrzésünk második részében, de mi történik az első részben? Valamit összehasonlítanak 1, de az valami … üres (amit az üres karakterlánc jelez '')!

Ezután ellenőrizzük a szkriptünket, miért van az az üres hely, és miért nem töltötte be a mi értékünk A változó. Gyorsan rájövünk a AA ahelyett A hibát, javítsa ki a hibát, és a szkript most jól működik!

A javított szkript javítva a hibával

Nagyon jó dolog, amire emlékezni kell a használat során bash -x hogy tudsz tee (ezt olvassa el ‘másolat’) a Bash parancs kimenetét azáltal, hogy a stderr-t (a hibakimenetet) átirányítja az stdout-ra (a standard kimenet), és ugyanezt rögzíti a tee:

A tee használata a bash -x kombinációval

Itt futtatjuk a fix szkriptünket, és átirányítjuk a hibakimenetet (bash -x az informatív hibakeresési kimenetet az stderr-nek, a standard hibakimenetnek küldi, és nem az stdout-nak) 2>&1 (amely átirányítja a stderr kimenetünket stdout-ra – a normál kimenetünkre). Ezután a stdout használatával rögzítjük tee és ez menti a kimenetet a megadott fájlba, mégpedig bash_-x_output.txt.

Ez lehetővé teszi a Bash fejlesztő számára, hogy lassan, lépésről lépésre átnézze az írott kódját. Különösen akkor, ha a programok bonyolulttá válnak, funkciókkal rendelkeznek, többszálúvá válnak, háttérfolyamatokat indítanak stb., A hibakeresés ezen módja nagyon értékes lehet. Példaként szoktam használni bash -x kéthetente egyszer a komplex szkriptek hibakereséséhez.

Szkriptek futtatása háttérfolyamatként

A szkript háttérfolyamatként történő futtatása egyszerű: egyszerűen ragasszuk fel a & parancsot a szkript nevének végére (egy szóközzel). Meghatározzuk background.sh alábbiak szerint:

#!/bin/bash

sleep 2

Ezután a következő módon kezdjük el – kiemelve a háttérben futó tényt:

Számos Bash parancs áramlása, egyik ilyen parancs háttérfolyamat

Amit láthatunk itt történni, az a következő: a background.sh szkript a háttérben indul (a & szóközzel rögzítve a parancsfájl nevéhez), és azonnal visszatér a parancssor. Ezt itt használjuk a következő parancs megadásával (sleep 1) közvetlenül a & háttéridióma, amely a parancsot egyetlen / egyetlen paranccsal is megszünteti (más szavakkal: sleep 1 egy teljesen új parancs).

Megszüntetjük a mi sleep 1 parancsot szokásos parancsnokság vége Bash idióma, amely után végrehajtunk egy echo hogy a sleep 1 teljes / kész. Ezután nézzük meg, mi történik a sor végrehajtásakor.

Azonnal a háttérfolyamatunk / szkriptünk (background.sh) elindul, és ez körülbelül 2 másodpercig fog futni. A megkezdett háttérfolyamat PID (folyamatazonosítója) vizuálisan látható (nevezetesen 773183 az első ([1]) háttérfolyamat – és ez a PID minden más, amikor elindítasz egy háttérprogramot / folyamatot), és a mi sleep 1 (a következő végrehajtási utasítás) most végre lehet hajtani, mivel a másik program visszaadta a promptunkat (bár itt közvetlenül nem látható, ez történik, amikor elindít egy háttérfolyamatot; azonnal visszakapja a parancssort).

A sleep 1 kezdődik (a sleep 2 vagy pontosabban a background.sh a szkript továbbra is a háttérben fut, mint más folyamat, egy alhéjban, amely a legfelső vagy magasabb szintű héj alatt kezdődött), és 1 másodperc múlva leáll. Ezek után a mi echo kivégzik, megmutatva nekünk a sleep 1 teljes. Egy másodperccel később a mi background.sh a folyamat 2 másodperces várakozással jár, és befejeződik.

Nem látjuk, hogy megszűnt volna, mivel a Bash héj arra vár, hogy valamilyen interakció megmutasson bennünket állapotüzenetek. Így amint megnyomjuk az Enter billentyűt, a két másodperces alvás lejárta után bármikor a háttérfolyamat befejeződését láthatjuk [1]+ Done ./background.sh állapotüzenet. Ha visszatér a minisorozatunk második részéhez, akkor láthatja, hogyan is használhattuk volna wait itt várni a háttérfolyamat PID befejezésére / befejezésére. Rávilágít arra is, hogy hány parancs és segédprogram használható kombinatív módon a Bash-ban.

Szkriptek importálása a következővel: forrás

Egy másik szkript importálása egyszerűen elvégezhető a Bash használatával source parancs. Vegye figyelembe a következő szkriptet testsource.sh:

#!/bin/bash

source mysource.sh

echo "${MYVAR}"

És az illesztés mysource.sh:

#!/bin/bash

MYVAR="Hello CloudSavvyIT Readers!"

Ha egyszerűen elkészítjük az első szkriptet (testsource.sh) végrehajtható (a chmod +x testsource.sh), de nem a második szkript (valójában a futtatható jelzőt állítottuk be, hogy egyértelműen megmutassuk, hogy ez a használatával működik chmod -x tovább mysource.sh), a második szkriptet továbbra is sikeresen meghívják a source parancsot, és a testsource.sh forgatókönyv:

Szkript beszerzése a Bash forrás paranccsal

Ban,-ben mysource.sh szkriptet, beállítjuk a változót MYVAR nak nek Hello CloudSavvyIT Readers!. Ezt a szkriptet a testsource.sh parancsfájl az utasítás használatával source mysource.sh. Ez okozza a mysource.sh ezen a ponton kell végrehajtani a kódot, és ha elkészült, a testsource.sh A szkript továbbra is futni fog, bár a mysource.sh megmarad (gondoljon erre úgy, mint egy másik forgatókönyvből származik hogy könnyebben emlékezzünk ennek működésére).

Összefoglalva

Megnéztük a szkript hibakeresését a használatával bash -x az összes végrehajtott parancs megjelenítéséhez. Azt is megvizsgáltuk, hogyan futtassunk egy szkriptet háttérfolyamatként, és megtudtuk, hogyan importálhatjuk a szkripteket a forrás segítségével. Köszönöm azért, hogy figyelemmel kísérje ezt a 3 részes sorozatot, amelynek ez volt az utolsó cikke!

Ha többet szeretne megtudni a Bash-ról, mit szólna a cikkek vagy cikkek megtekintéséhez Alapozás: Bash Loops: for, while és amíg, Feltételes tesztelés Bash-ban: ha, akkor, más, elif, és Bash függvények és helyi változók

[ad_2]
Source link