ПадСниС Π² ΠΊΡ€ΠΎΠ»ΠΈΡ‡ΡŒΡŽ Π½ΠΎΡ€Ρƒ: Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΉ ошибкС ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ varnish β€” Ρ‡Π°ΡΡ‚ΡŒ 1

ghostinushanka, ΠΌΠΎΠ»ΠΎΡ‚ΠΈΠ² ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… 20 ΠΌΠΈΠ½ΡƒΡ‚, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΡ‚ этого зависСла Π΅Π³ΠΎ Тизнь, поворачиваСтся ΠΊΠΎ ΠΌΠ½Π΅ с ΠΏΠΎΠ»Ρƒ-Π΄ΠΈΠΊΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² Π³Π»Π°Π·Π°Ρ… ΠΈ Ρ…ΠΈΡ‚Ρ€ΠΎΠΉ ΡƒΡ…ΠΌΡ‹Π»ΠΊΠΎΠΉ β€” «Π§ΡƒΠ²Π°ΠΊ, я каТСтся понял.»

«ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈ Π²ΠΎΡ‚ сюда,» β€” Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, показывая Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· символов Π½Π° экранС β€” «Π‘ΠΏΠΎΡ€ΠΈΠΌ Π½Π° мою ΠΊΡ€Π°ΡΠ½ΡƒΡŽ ΡˆΠ»ΡΠΏΡƒ, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π²ΠΎΡ‚ сюда Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я Ρ‚Π΅Π±Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ послал» β€” показывая Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ участок ΠΊΠΎΠ΄Π° β€” «ΠΎΡˆΠΈΠ±ΠΊΠ° ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ.»

НСмного ΠΎΠ·Π°Π΄Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈ ΡƒΡΡ‚Π°Π²ΡˆΠΈΠΉ, я измСняю sed Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽ Ρ„Π°ΠΉΠ» ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽ systemctl varnish reload. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС исчСзло…

«ΠœΠ΅ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ я обмСнивался с ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠΌ,» ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ» ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π°, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡƒΡ…ΠΌΡ‹Π»ΠΊΠ° пСрСрастаСт Π² Π½Π΅ΠΏΠΎΠ΄Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΡƒΠ»Ρ‹Π±ΠΊΡƒ ΠΏΠΎΠ»Π½ΡƒΡŽ радости, «Π”ΠΎ мСня Π²Π΄Ρ€ΡƒΠ³ дошло Ρ‡Ρ‚ΠΎ это Ρ‚ΠΎΡ‡Π½ΠΎ такая ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°!»

Π‘ Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΎ всё Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΎΡΡŒ

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ bash, awk, sed ΠΈ systemd. Π—Π½Π°Π½ΠΈΠ΅ varnish привСтствуСтся, Π½ΠΎ Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.
Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ Π² сниппСтах ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹.
Написано вмСстС с ghostinushanka.
Π­Ρ‚ΠΎΡ‚ тСкст являСтся ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° английском языкС Π΄Π²Π΅ Π½Π΅Π΄Π΅Π»ΠΈ Π½Π°Π·Π°Π΄; ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ boikoden.

Π‘ΠΎΠ»Π½Ρ†Π΅ просвСчиваСт сквозь ΠΏΠ°Π½ΠΎΡ€Π°ΠΌΠ½Ρ‹Π΅ ΠΎΠΊΠ½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΌ Ρ‚Ρ‘ΠΏΠ»Ρ‹ΠΌ осСнним ΡƒΡ‚Ρ€ΠΎΠΌ, Ρ‡Π°ΡˆΠΊΠ° свСТСприготовлСнного насыщСнного ΠΊΠΎΡ„Π΅ΠΈΠ½ΠΎΠΌ Π½Π°ΠΏΠΈΡ‚ΠΊΠ° покоится Π² сторонС ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π² Π½Π°ΡƒΡˆΠ½ΠΈΠΊΠ°Ρ… Π·Π²ΡƒΡ‡ΠΈΡ‚ любимая симфония Π·Π²ΡƒΠΊΠΎΠ², ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΡˆΠ΅Π»Π΅ΡΡ‚ мСханичСских ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€, ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ записью Π² спискС Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΎΠ² бэклога Π½Π° ΠΊΠ°Π½Π±Π°Π½ доскС ΠΈΠ³Ρ€ΠΈΠ²ΠΎ свСтится ΡΡƒΠ΄ΡŒΠ±ΠΎΠ½ΠΎΡΠ½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ β€œInvestigate varnishreload sh: echo: I/O error in staging” (РасслСдуйтС β€œvarnishreload sh: echo: I/O error” Π² стСйдТС). Когда Ρ€Π΅Ρ‡ΡŒ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎ varnish-Π΅, ошибкам Π½Π΅Ρ‚ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мСста, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π΅ Π²Ρ‹Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΊΠ°ΠΊ Π² этом случаС.

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌ с varnishreload, это простой шСлл скрипт, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ varnish-Π° β€” Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ VCL.

Как подсказываСт Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΊΠ΅Ρ‚Π°, ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· сСрвСров Π½Π° стСйдТС, Π° Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ я Π±Ρ‹Π» ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ varnish-Π° Π½Π° стСйдТС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ исправно, я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π»ΠΊΠΎΠΉ ошибкой. Π’Π°ΠΊ, просто сообщСниС попавшСС Π² ΡƒΠΆΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π‘Π΅Ρ€Ρƒ Ρ‚ΠΈΠΊΠ΅Ρ‚ сСбС, Π² ΠΏΠΎΠ»Π½ΠΎΠΉ увСрСнности, Ρ‡Ρ‚ΠΎ я Π΅Π³ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Ρƒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΌΠ΅Π½Π΅Π΅ Ρ‡Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· 30 ΠΌΠΈΠ½ΡƒΡ‚, ΠΏΠΎΡ…Π»ΠΎΠΏΠ°ΡŽ сам сСбя ΠΏΠΎ ΠΏΠ»Π΅Ρ‡Ρƒ Π·Π° очистку Π±ΠΎΡ€Π΄Ρ‹ ΠΎΡ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Ρ…Π»Π°ΠΌΠ° ΠΈ Π²Π΅Ρ€Π½ΡƒΡΡŒ ΠΊ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌ Π΄Π΅Π»Π°ΠΌ.

Π’Ρ€Π΅Π·Π°ΡΡΡŒ Π² стСну Π½Π° скорости 200 ΠΊΠΌ/Ρ‡

ΠžΡ‚ΠΊΡ€Ρ‹Π² Ρ„Π°ΠΉΠ» varnishreload, Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· сСрвСров ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Debian Stretch, я ΡƒΠ²ΠΈΠ΄Π΅Π» шСлл скрипт Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΌΠ΅Π½Π΅Π΅ 200 строк.

ΠŸΡ€ΠΎΠ±Π΅ΠΆΠ°Π²ΡˆΠΈΡΡŒ ΠΏΠΎ скрипту, я Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» Π½ΠΈΡ‡Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π»ΠΈΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΌ Π΅Π³ΠΎ запускС прямо ΠΈΠ· Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², это стСйдТ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΎ ΠΈ сломаСтся, Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ну… Π½Π΅ слишком ΠΌΠ½ΠΎΠ³ΠΎ. Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ скрипт ΠΈ ΡΠΌΠΎΡ‚Ρ€ΡŽ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», Π²ΠΎΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ошибок ΡƒΠΆΠ΅ ΠΈ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ.

Π•Ρ‰Π΅ ΠΏΠ°Ρ€Ρƒ запусков, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ я Π½Π΅ ΠΌΠΎΠ³Ρƒ воспроизвСсти ΠΎΡˆΠΈΠ±ΠΊΡƒ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… усилий, ΠΈ я Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ этот скрипт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΈ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

ΠœΠΎΠΆΠ΅Ρ‚ скрипту ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΡŒ STDOUT (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ > &-)? Или STDERR? Ни Ρ‚ΠΎ Π½ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π½Π΅ сработало.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, systemd ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ измСняСт срСду запуска, Π½ΠΎ ΠΊΠ°ΠΊ, ΠΈ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ?
Π’Ρ€ΡƒΠ±Π°ΡŽ vim ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΡŽ varnishreload, добавляя set -x прямо ΠΏΠΎΠ΄ шСбанг, надСясь, Ρ‡Ρ‚ΠΎ Π΄Π΅Π±Π°Π³ Π²Ρ‹Π²ΠΎΠ΄ скрипта ΠΏΡ€ΠΎΠ»ΡŒΡ‘Ρ‚ Ρ‡ΡƒΡ‚ΠΎΡ‡ΠΊΡƒ свСта.

Π€Π°ΠΉΠ» ΠΏΠΎΠΏΡ€Π°Π²Π»Π΅Π½, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ я ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽ varnish ΠΈ Π²ΠΈΠΆΡƒ Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ начисто всё сломало… Π’Ρ‹Ρ…Π»ΠΎΠΏ β€” ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π±Π°Ρ€Π΄Π°ΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚ΠΎΠ½Π½Ρ‹ Π‘ΠΈ-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π”Π°ΠΆΠ΅ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ нСдостаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π³Π΄Π΅ ΠΎΠ½ΠΎ начинаСтся. Π― Π² ΠΏΠΎΠ»Π½ΠΎΠΌ Π·Π°ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π΅. ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Ρ€Π΅ΠΆΠΈΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ запускаСмых Π² скриптС? НСт, Π±Ρ€Π΅Π΄. Π‘Π°Π³ Π² шСллС? НСсколько Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… сцСнариСв нСсутся Π² ΠΌΠΎΠ΅ΠΉ Π³ΠΎΠ»ΠΎΠ²Π΅ ΠΊΠ°ΠΊ Ρ‚Π°Ρ€Π°ΠΊΠ°Π½Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Π΅ стороны. Чашка ΠΊΠΎΡ„Π΅ΠΈΠ½ΠΎ-ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π½Π°ΠΏΠΈΡ‚ΠΊΠ° ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΎΡˆΠ°Π΅Ρ‚ΡΡ, быстроС ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠ΅ Π½Π° ΠΊΡƒΡ…Π½ΡŽ для пополнСния запаса и… ΠΏΠΎΠ΅Ρ…Π°Π»ΠΈ. Π― ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽ скрипт ΠΈ ΠΏΡ€ΠΈΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡΡŒ ΠΊ ΡˆΠ΅Π±Π°Π½Π³Ρƒ: #!/bin/sh.

/bin/sh β€” это вСдь просто симлинк Π½Π° bash, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ скрипт интСрпрСтируСтся Π² POSIX-совмСстимом Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π²Π΅Ρ€Π½ΠΎ? НС Ρ‚ΡƒΡ‚-Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ! ΠžΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Debian β€” это dash, ΠΈ это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Π½Π° Ρ‡Ρ‚ΠΎ ссылаСтся /bin/sh.

# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jan 24  2017 /bin/sh -> dash

ΠŸΡ€ΠΎΠ±Ρ‹ Ρ€Π°Π΄ΠΈ, я ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» шСбанг Π½Π° #!/bin/bash, ΡƒΠ΄Π°Π»ΠΈΠ» set -x ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Π΅Ρ‰Ρ‘ Ρ€Π°Π·. НаконСц-Ρ‚ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ varnish-Π°, Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ появилась сносная ошибка:

Jan 01 12:00:00 hostname varnishreload[32604]: /usr/sbin/varnishreload: line 124: echo: write error: Broken pipe
Jan 01 12:00:00 hostname varnishreload[32604]: VCL 'reload_20190101_120000_32604' compiled

Π‘Ρ‚Ρ€ΠΎΠΊΠ° 124, Π²ΠΎΡ‚ ΠΎΠ½ΠΎ!

114 find_vcl_file() {
115         VCL_SHOW=$(varnishadm vcl.show -v "$VCL_NAME" 2>&1) || :
116         VCL_FILE=$(
117                 echo "$VCL_SHOW" |
118                 awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}' | {
119                         # all this ceremony to handle blanks in FILE
120                         read -r DELIM VCL_SHOW INDEX SIZE FILE
121                         echo "$FILE"
122                 }
123         ) || :
124
125         if [ -z "$VCL_FILE" ]
126         then
127                 echo "$VCL_SHOW" >&2
128                 fail "failed to get the VCL file name"
129         fi
130
131         echo "$VCL_FILE"
132 }

Но ΠΊΠ°ΠΊ оказалось, строка 124 довольно пуста ΠΈ интСрСса Π½Π΅ прСдставляСт. Π― ΠΌΠΎΠ³ лишь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ многострочника, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π½Π° 116-ΠΉ строкС.
Π§Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ записываСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ VCL_FILE Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΠΎΠ³ΠΎ саб-шСлла?

Π’ Π½Π°Ρ‡Π°Π»Π΅, ΠΎΠ½ отправляСт содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ VLC_SHOW, созданной Π½Π° строкС 115, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΉΠΏΡƒ. А Ρ‚Π°ΠΌ-Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ³Π΄Π° происходит?

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ varnishadm, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ установочного ΠΏΠ°ΠΊΠ΅Ρ‚Π° varnish, для настройки varnish-Π° Π±Π΅Π· пСрСзапуска.

Подкоманда vcl.show -v ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π²ΠΎΠ΄Π° всСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ VCL, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² ${VCL_NAME}, Π² STDOUT.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ VCL, Π° Ρ‚Π°ΠΊΠΆΠ΅ нСсколько ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсий ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ varnish-Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всС Π΅Ρ‰Π΅ находятся Π² памяти, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ varnishadm vcl.list, Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π½ΠΈΠΆΠ΅:

discarded   cold/busy       1 reload_20190101_120000_11903
discarded   cold/busy       2 reload_20190101_120000_12068
discarded   cold/busy       16 reload_20190101_120000_12259
discarded   cold/busy       16 reload_20190101_120000_12299
discarded   cold/busy       28 reload_20190101_120000_12357
active      auto/warm       32 reload_20190101_120000_12397
available   auto/warm       0 reload_20190101_120000_12587

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ${VCL_NAME} устанавливаСтся Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ части скрипта varnishreload Π½Π° имя Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ VCL, Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ имССтся. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это Π±ΡƒΠ΄Π΅Ρ‚ β€œreload_20190101_120000_12397”.

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, пСрСмСнная ${VCL_SHOW} содСрТит ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для varnish, ΠΏΠΎΠΊΠ° ясно. Π’Π΅ΠΏΠ΅Ρ€ΡŒ я, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, понял, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Ρ‹Π²ΠΎΠ΄ dash с set -x оказался Ρ‚Π°ΠΊΠΈΠΌ Π±ΠΈΡ‚Ρ‹ΠΌ β€” ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π°Π» Π² сСбя содСрТимоС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅ΠΉΡΡ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ полная конфигурация VCL часто ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слСплСна ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ². ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² Π‘ΠΈ стилС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, Π³Π΄Π΅ ΠΎΠ΄Π½ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΈ это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, ΠΎ Ρ‡Π΅ΠΌ, собствСнно, вся привСдённая Π½ΠΈΠΆΠ΅ строка Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°.
Бинтаксис ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

// VCL.SHOW <NUM> <NUM> <FILENAME>

Π¦ΠΈΡ„Ρ€Ρ‹ Π² Π΄Π°Π½Π½ΠΎΠΌ контСкстС Π½Π΅ Π²Π°ΠΆΠ½Ρ‹, нас интСрСсуСт имя Ρ„Π°ΠΉΠ»Π°.

Π§Ρ‚ΠΎ ΠΆΠ΅ Π² ΠΈΡ‚ΠΎΠ³Π΅ творится Π² Π±ΠΎΠ»ΠΎΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΡΡ Π½Π° строкС 116?
Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся.
Команда состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… частСй:

  1. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ echo, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ‰Π΅Ρ‚ строку (запись), Π³Π΄Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ, послС разбиСния тСкста, Π±ΡƒΠ΄Π΅Ρ‚ β€œ//”, Π° Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ β€” «VCL.SHOW».
    Awk Π²Ρ‹ΠΏΠΈΡˆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ этим шаблонам, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Π‘Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сохраняСт Π² ΠΏΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… значСния ΠΏΠΎΠ»Π΅ΠΉ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. ΠŸΡΡ‚Π°Ρ пСрСмСнная FILE ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ остаток строки. НаконСц, послСдний echo выписываСт содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС шаги с 1 ΠΏΠΎ 3 Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² саб-шСлл, Π²Ρ‹Π²ΠΎΠ΄ значСния $FILE Π±ΡƒΠ΄Π΅Ρ‚ записан Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ VCL_FILE.

Как слСдуСт ΠΈΠ· коммСнтария Π½Π° 119-ΠΉ строкС, это слуТит СдинствСнной Ρ†Π΅Π»ΠΈ: Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ случаи, ΠΊΠΎΠ³Π΄Π° VCL Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ с символами ΠΏΡ€ΠΎΠ±Π΅Π»Π° Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ.

Π― Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ для ${VCL_FILE} ΠΈ попытался ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄, Π½ΠΎ это Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ. Π£ мСня всё Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ чисто, Π° Π² случаС запуска сСрвиса Π²Ρ‹Π΄Π°Π²Π°Π»ΠΎ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ ошибка просто Π½Π΅ воспроизводима ΠΏΡ€ΠΈ запускС скрипта Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΏΡ€ΠΈ этом ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹Π΅ 30 ΠΌΠΈΠ½ΡƒΡ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ ΡƒΠΆΠ΅ Ρ€Π°Π· ΡˆΠ΅ΡΡ‚ΡŒ ΠΈ, Π² довСсок, появилась Π±ΠΎΠ»Π΅Π΅ приоритСтная Π·Π°Π΄Π°Ρ‡Π°, ΠΎΡ‚ΠΎΠ΄Π²ΠΈΠ½ΡƒΠ²ΡˆΠ°Ρ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π΅Π»Π° Π² сторону. ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ Π½Π΅Π΄Π΅Π»ΠΈ Π±Ρ‹Π»Π° Π·Π°Π±ΠΈΡ‚Π° самыми Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ ΠΈ Π±Ρ‹Π»Π° лишь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π±Π°Π²Π»Π΅Π½Π° Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠΌ ΠΎ sed ΠΈ собСсСдованиСм с ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠΌ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ошибкой Π² varnishreload Π±Ρ‹Π»Π° Π±Π΅Π·Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎ утСряна Π² пСсках Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π’Π°ΡˆΠ΅ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ sed-фу… Π½Π° самом дСлС… Π΄Ρ€ΡΠ½ΡŒ

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π½Π΅Π΄Π΅Π»Π΅ выдался ΠΎΠ΄ΠΈΠ½ довольно свободный дСнь, поэтому я снова Ρ€Π΅ΡˆΠΈΠ» Π·Π°Π½ΡΡ‚ΡŒΡΡ этим Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΎΠΌ. Π― надСялся, Ρ‡Ρ‚ΠΎ Π² ΠΌΠΎΡ‘ΠΌ ΠΌΠΎΠ·Π³Ρƒ, ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ процСсс всё это врСмя искал Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Π² этот Ρ€Π°Π· я ΡƒΠΆ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠΉΠΌΡƒ Π² Ρ‡Ρ‘ΠΌ Π΄Π΅Π»ΠΎ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ Ρ€Π°Π· простоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ, я просто Ρ€Π΅ΡˆΠΈΠ» Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ начиная со 116-ΠΉ строки. Π’ любом случаС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π±Ρ‹Π» Π΄ΡƒΡ€ΠΊΠΎΠ²Π°Ρ‚Ρ‹ΠΌ. И Π² Π½Ρ‘ΠΌ Π½Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ read.

Глядя Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ Π΅Ρ‰Π΅ Ρ€Π°Π·:
sh: echo: broken pipe β€” Π² этой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ echo находится Π² Π΄Π²ΡƒΡ… мСстах, Π½ΠΎ я ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°ΡŽ, Ρ‡Ρ‚ΠΎ пСрвая β€” Π±ΠΎΠ»Π΅Π΅ вСроятный Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊ (Π½Ρƒ ΠΈΠ»ΠΈ хотя-Π±Ρ‹ соучастник). Awk Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π²Π½ΡƒΡˆΠ°Π΅Ρ‚ довСрия. И Π² случаС, Ссли Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ это awk | {read; echo} конструкция ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎ всСм этим ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π΅Ρ‘ Π½Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ? Π­Ρ‚Π° однострочная ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ всС возмоТности awk, Π΄Π° Π΅Ρ‰Ρ‘ ΠΈ этот лишний read Π² довСсок.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ Π½Π΅Π΄Π΅Π»Π΅ Π±Ρ‹Π» Π΄ΠΎΠΊΠ»Π°Π΄ ΠΎ sed, я Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ свои Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Π½Ρ‹Π΅ Π½Π°Π²Ρ‹ΠΊΠΈ ΠΈ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ echo | awk | { read; echo} Π² Π±ΠΎΠ»Π΅Π΅ понятный echo | sed. Π₯отя это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π½Π΅ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Π²Ρ‹ΡΠ²Π»Π΅Π½ΠΈΡŽ ошибки, я ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽ своС sed-fu ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠ·Π½Π°ΡŽ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅. По Ρ…ΠΎΠ΄Ρƒ Π΄Π΅Π»Π° я попросил своСго ΠΊΠΎΠ»Π»Π΅Π³Ρƒ, Π°Π²Ρ‚ΠΎΡ€Π° Π΄ΠΎΠΊΠ»Π°Π΄Π° ΠΎ sed, ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивный sed скрипт.

Π― скинул содСрТимоС varnishadm vcl.show -v "$VCL_NAME" Π² Ρ„Π°ΠΉΠ», Ρ‚Π°ΠΊ я ΠΌΠΎΠ³ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° написании sed скрипта Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Ρ…Π»ΠΎΠΏΠΎΡ‚, связанных с ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°ΠΌΠΈ сСрвиса.

ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ sed ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΅Π³ΠΎ GNU руководствС. Π’ исходниках sed символ n явно ΡƒΠΊΠ°Π·Π°Π½ Π² качСствС раздСлитСля строк.

Π’ нСсколько ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ² ΠΈ с рСкомСндациями ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ ΠΌΡ‹ написали sed скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Π²Π°Π» Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ вся исходная строка 116.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Ρ„Π°ΠΉΠ»Π° со Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

> cat vcl-example.vcl
Text
// VCL.SHOW 0 1578 file with 3 spaces.vcl
More text
// VCL.SHOW 0 1578 file.vcl
Even more text
// VCL.SHOW 0 1578 file with TWOspaces.vcl
Final text

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ описания, Π½ΠΎ нас интСрСсуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ // VCL.SHOW, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько. ИмСнно поэтому ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ awk Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ совпадСния.

# шаг ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, вывСсти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строки с коммСнтариями
# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ возмоТности sed, опрСдСляСтся символ-Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции '#' вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ '/', Π·Π° счёт этого Π½Π΅ придётся ΡΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ косыС Π² искомом ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ
# опрСдСляСтся рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ β€œ// VCL.SHOW”, для поиска строк с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ шаблоном
# Ρ„Π»Π°Π³ -n позаботится ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ sed Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ» всС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠ°ΠΊ ΠΎΠ½ это Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (см. ссылку Π²Ρ‹ΡˆΠ΅)
# -E позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ рСгулярныС выраТСния
> cat vcl-processor-1.sed
#// VCL.SHOW#p
> sed -En -f vcl-processor-1.sed vcl-example.vcl
// VCL.SHOW 0 1578 file with 3 spaces.vcl
// VCL.SHOW 0 1578 file.vcl
// VCL.SHOW 0 1578 file with TWOspaces.vcl

# шаг Π²Ρ‚ΠΎΡ€ΠΎΠΉ, вывСсти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя Ρ„Π°ΠΉΠ»Π°
# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ β€œsubstitute”, с Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, отобраТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нуТная Π³Ρ€ΡƒΠΏΠΏa
# ΠΈ это дСлаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для совпадСний, Ρ€Π°Π½Π΅Π΅ описанного поиска
> cat vcl-processor-2.sed
#// VCL.SHOW# {
    s#.* [0-9]+ [0-9]+ (.*)$#1#
    p
}
> sed -En -f vcl-processor-2.sed vcl-example.vcl
file with 3 spaces.vcl
file.vcl
file with TWOspaces.vcl

# шаг Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²
# ΠΊΠ°ΠΊ ΠΈ Π² случаС с awk, добавляСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ послС ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ совпадСния
> cat vcl-processor-3.sed
#// VCL.SHOW# {
    s#.* [0-9]+ [0-9]+ (.*)$#1#
    p
    q
}
> sed -En -f vcl-processor-3.sed vcl-example.vcl
file with 3 spaces.vcl

# шаг Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ, ΡΡ…Π»ΠΎΠΏΠ½ΡƒΡ‚ΡŒ всё Π² однострочник, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ двоСточия для раздСлСния ΠΊΠΎΠΌΠ°Π½Π΄
> sed -En -e '#// VCL.SHOW#{s#.* [0-9]+ [0-9]+ (.*)$#1#p;q;}' vcl-example.vcl
file with 3 spaces.vcl

Π˜Ρ‚Π°ΠΊ, содСрТимоС скрипта varnishreload Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

VCL_FILE="$(echo "$VCL_SHOW" | sed -En '#// VCL.SHOW#{s#.*[0-9]+ [0-9]+ (.*)$#1#p;q;};')"

Π’Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
Если строка соотвСтствуСт рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ // VCL.SHOW, Ρ‚ΠΎΠ³Π΄Π° ΠΆΠ°Π΄Π½ΠΎ соТри тСкст, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Π° числа Π² этой строкС, ΠΈ сохрани всё, Ρ‡Ρ‚ΠΎ останСтся послС этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’Ρ‹Π΄Π°ΠΉ сохранённоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

ΠŸΡ€ΠΎΡΡ‚ΠΎ, Π½Π΅ ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ?

ΠœΡ‹ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹ sed скриптом ΠΈ Ρ‚Π΅ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ замСняСт собой вСсь ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. ВсС ΠΌΠΎΠΈ тСсты Π΄Π°Π»ΠΈ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, поэтому я ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» β€œvarnishreload” Π½Π° сСрвСрС ΠΈ снова запустил systemctl reload varnish. Поганая ошибка echo: write error: Broken pipe вновь смСялась Π½Π°ΠΌ Π² Π»ΠΈΡ†ΠΎ. ΠŸΠΎΠ΄ΠΌΠΈΠ³ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ курсор ΠΎΠΆΠΈΠ΄Π°Π» Π²Π²ΠΎΠ΄Π° Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Ρ‚Π΅ΠΌΠ½ΠΎΠΉ пустотС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°…

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com