Ọkan diẹ Heisenbug ti o ti kọja awọn ooni

Ọkan diẹ Heisenbug ti o ti kọja awọn ooni

$> set -o pipefail

$> fortune | head -1 > /dev/null && echo "Повезло!" || echo "Вы проиграли"
Повезло!

$> fortune | head -1 > /dev/null && echo "Повезло!" || echo "Вы проиграли"
Вы проиграли

o ti wa ni fortune ni àídájú eto lai exit(rand()).

Ṣe o le ṣe alaye? kini aṣiṣe nibi?

Lirical-itan digression

Mo kọkọ mọ Heisenbug yii ni oṣu mẹẹdogun sẹyin. Lẹhinna fun ẹnu-ọna ni FaxNET o jẹ dandan lati ṣẹda ọpọlọpọ awọn ohun elo nipasẹ awọn pipẹ "awọn oluyẹwo ti nṣire" labẹ FreeBSD. Gẹgẹbi a ti ṣe yẹ, Mo ro ara mi si oluṣeto ilọsiwaju ati ti o ni iriri iṣẹtọ. Nitorinaa, Mo pinnu lati ṣe ohun gbogbo ni pẹkipẹki ati ni iṣọra bi o ti ṣee, san ifojusi pataki si mimu aṣiṣe…

Iriri mi iṣaaju ti ṣiṣe pẹlu awọn idun ni sendmail ati uucp/uupc ṣafikun si aisimi mi ni “mimu aṣiṣe ni kikun.” Ko si aaye ni omiwẹ sinu awọn alaye ti itan yẹn, ṣugbọn Mo tiraka pẹlu Heisenbug yii fun ọsẹ meji fun awọn wakati 10-14. Nitorinaa, o ranti, ati ni ana ni ojulumọ atijọ yii duro lati ṣabẹwo lẹẹkansi.

TL; DR Idahun

IwUlO head le pa ikanni lati fortune lẹsẹkẹsẹ ni kete bi o ti ka ila akọkọ. Ti o ba jẹ fortune jade ju ila kan lọ, lẹhinna ipe ti o baamu write() yoo da aṣiṣe pada tabi jabo pe awọn baiti diẹ ni o jade ju ti o beere lọ. Ni ọna, kọ pẹlu iṣọra aṣiṣe mimu fortune ni ẹtọ lati ṣe afihan ipo yii ni ipo ijade rẹ. Lẹhinna nitori fifi sori ẹrọ set -o pipefail yoo ṣiṣẹ || echo "Вы проиграли".

Sibẹsibẹ, head le ma ṣe ni akoko sunmọ ṣaaju ki o to fortune yoo pari ṣiṣejade data. Lẹhinna o yoo ṣiṣẹ && echo "Повезло!".

Ninu ọkan ninu mi loni GNUMakefile nibẹ ni iru ajẹkù:

echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"'

Itumọ si eniyan

O wọpọ nibi fun GNU Ṣe и Basi ni ọna alakojo lilo aṣayan --version o beere ẹniti o jẹ, ati pe ti aṣayan ko ba ni atilẹyin, lẹhinna a fi stub kan sii "Jọwọ lo GCC tabi CLAG akopo ibaramu".

Bi igbomikana le ri nibikibi. O farahan ni aaye yii ni igba pipẹ sẹhin ati pe o ṣiṣẹ ni pipe nibi gbogbo (Linux, Solaris, OSX, FreeBSD, WSL ati be be lo). Sugbon lana ni altlinux lori Syeed Elbrus 2000 (E2K) Mo ti ṣakiyesi:

#define MDBX_BUILD_COMPILER "lcc:1.23.20:Sep--4-2019:e2k-v3-linux Please use GCC or CLANG compatible compiler"

Ni otitọ, Emi ko mọ lẹsẹkẹsẹ “ojulumọ” mi atijọ. Pẹlupẹlu, ise agbese na ti ni idanwo ni ọpọlọpọ igba lori Elbrus ati labẹ ọpọlọpọ awọn pinpin ti o yatọ, pẹlu Alt. Pẹlu ọpọlọpọ awọn akopọ, awọn ẹya ti GNU Rii ati bash. Nitorinaa, Emi ko fẹ lati rii aṣiṣe mi nibi.

Nigbati o ba n gbiyanju lati ṣe atunṣe iṣoro naa ati / tabi loye ohun ti n ṣẹlẹ, awọn ohun ajeji diẹ sii bẹrẹ si ṣẹlẹ.
Akọtọ laini aṣẹ:

echo "#define MDBX_BUILD_COMPILER '$(set -o pipefail; LC_ALL=C cc --version | head -1 || echo "Please use GCC or CLANG compatible compiler")'"

Ni gbogbo igba ati lẹhinna o yoo gbejade ọrọ afikun, lẹhinna kii ṣe… Nigbagbogbo ọkan ninu awọn aṣayan yoo duro fun igba pipẹ, ṣugbọn ti o ba gun gun, o nigbagbogbo ni mejeeji!

Dajudaju, strace ohun gbogbo wa! Ati pe ti o ti tẹ tirade strace, ṣugbọn ko ni akoko lati tẹ Tẹ, Mo mọ ọrẹ mi atijọ Ọgbẹni Heisenbug, ati awọn olupilẹṣẹ alakojo Ara mi ni ọdun 25 sẹhin, Nostalgie… Ati pe Mo pinnu lati ni ibanujẹ ati kọ akọsilẹ yii 😉

Nipa ona, bi eyikeyi ara-respecting Heisenbug, labẹ strace prefers ko lati ẹda.

Nitorina kini o n ṣẹlẹ?

  • IwUlO head ni ẹtọ (tabi dipo, paapaa fi agbara mu) lati pa ikanni ti a ka ni kete ti o ba ka nọmba ti o beere fun awọn ila.
  • Onkọwe eto-ti ipilẹṣẹ data (ninu ọran yii cc) le tẹ sita ọpọ ila ati ofe ṣe eyi nipasẹ ọpọ awọn ipe write().
  • ti o ba ti oluka yoo ni akoko lati pa ikanni ti o wa ni ẹgbẹ rẹ ṣaaju ki o to pari igbasilẹ lori ẹgbẹ onkqwe, lẹhinna onkọwe yoo gba aṣiṣe.
  • Eto onkqwe ni ẹtọ si mejeeji foju kọ aṣiṣe ikanni ki o ṣe afihan rẹ ninu koodu ipari rẹ.
  • Nitori fifi sori ẹrọ set -o pipefail koodu ipari pipe yoo jẹ ti kii-odo (aṣiṣe) ti abajade ko ba jẹ odo lati o kere ju ipin kan, ati lẹhinna yoo ṣiṣẹ || echo "Please use GCC or CLANG compatible compiler".

Awọn iyatọ le wa ti o da lori bii eto onkọwe ṣe n ṣiṣẹ pẹlu awọn ifihan agbara. Fun apẹẹrẹ, eto naa le fopin si aiṣedeede (pẹlu iran aifọwọyi ti ipo ifopinsi ti kii-odo/aṣiṣe), tabi write() yoo da esi ti kikọ diẹ baiti ju beere ati ṣeto errno = EPIPE.

Tani o jẹbi?

Ninu ọran ti a ṣalaye diẹ ninu ohun gbogbo. Aṣiṣe mimu ni cc (lcc:1.23.20:Sep—4-2019:e2k-v3-linux) kiise laiṣe. Ni ọpọlọpọ awọn ọran o dara lati ṣe aṣiṣe ni ẹgbẹ iṣọra, botilẹjẹpe eyi ṣe afihan awọn abawọn lojiji ni awo igbomikana ti a ṣe apẹrẹ fun ihuwasi aṣa.

Kini o yẹ ki n ṣe?

Ko tọ:

fortune | head -1 && echo "Повезло, но вы рискуете!" || echo "WTF?"

Ti o tọ:

  1. (fortune && echo "Успешно" || echo "Ошибка") | head -1

    Nibi, pipadii paipu ni kutukutu yoo jẹ itọju nipasẹ onitumọ aṣẹ nigbati o ba nṣe iranṣẹ opo gigun ti ile ite (“laarin” awọn akọmọ). Gegebi, ti o ba fortune yoo jabo aṣiṣe ni kikọ si ikanni pipade ni ipo, lẹhinna o wu jade || echo "Ошибка" kii yoo gba nibikibi, niwon ikanni ti wa ni pipade tẹlẹ.

  2. fortune | cat - | head -1 && echo "Успешно" || echo "Ошибка"

    Eyi ni ohun elo naa cat Awọn iṣe bi ọririn nitori pe o kọju aṣiṣe naa EPIPE lori yiyọ kuro. Eyi to fun ipari bayi fortune kekere (awọn ila pupọ) ati pe o baamu ni ifipamọ ikanni (lati 512 baiti si ≈64K, ni ọpọlọpọ OS ≥4K). Bibẹẹkọ, iṣoro naa le pada.

Bi o ṣe le ṣe ilana ti o tọ EPIPE ati awọn aṣiṣe igbasilẹ miiran?

Ko si ojutu ọtun kan, ṣugbọn awọn iṣeduro ti o rọrun wa:

  • EPIPE ti a beere gbọdọ wa ni ilọsiwaju (ati afihan ni ipo ijade) nigbati o ba njade data ti o nilo iduroṣinṣin. Fun apẹẹrẹ, lakoko iṣẹ ti awọn ile ifi nkan pamosi tabi awọn ohun elo afẹyinti.
  • EPIPE dara lati foju nigbati o nfihan alaye ati awọn ifiranṣẹ iranlọwọ. Fun apẹẹrẹ, nigba fifi alaye han lori awọn aṣayan --help tabi --version.
  • Ti koodu ti n dagbasoke le ṣee lo ni opo gigun ti epo ṣaaju ki o to | headlẹhinna EPIPE O dara lati foju, bibẹẹkọ o dara lati ṣe ilana ati ṣe afihan ni ipo ijade.

Emi yoo fẹ lati lo anfani yii lati sọ idupẹ mi si awọn ẹgbẹ MCST и altlinux fun nla productive iṣẹ. Ipinnu rẹ jẹ iyanu!
Jeki soke Camarades, soke ipade ninu isubu!

Спасибо berez fun atunse typos ati awọn aṣiṣe.
KDPV lati George A.

orisun: www.habr.com

Fi ọrọìwòye kun