[{"data":1,"prerenderedAt":1585},["ShallowReactive",2],{"$fLyXwXPDNilMcqrQIBYyqSWpGiAxKyGA2B-p6PANMRC8":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":124,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":127,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":453,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":456,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":700,"mdc-ndw3py-key":720,"mdc-yhmjcc-key":746,"mdc--yamnk0-key":754,"mdc-7z4vjk-key":762,"mdc-xsgw56-key":770,"mdc--t8oa0j-key":778,"mdc--ggv6s6-key":835,"mdc-u1kp4b-key":850,"mdc-qncd0h-key":888,"mdc--x0dse5-key":905,"mdc-bdf6nv-key":1043,"mdc--v9idgr-key":1063,"mdc--bqu9ft-key":1183,"mdc--ox300b-key":1201,"mdc-ty99bk-key":1235,"mdc--7uh6vp-key":1305,"mdc--jbed16-key":1361,"mdc--2uw0j1-key":1369,"mdc-qmhuyq-key":1394,"mdc-ec5lm7-key":1450,"mdc-68448e-key":1467,"mdc--8cjbyv-key":1548},{"content":4,"quizQuestionContent":95,"type":114,"pageMeta":115},[5,9,13,16,20,24,27,31,34,38,41,45,48,52,55,59,62,66,69,73,76,79,82,86,89,92],{"id":6,"value":7,"isTypeH1":8},"1874","Разбор Bash скрипта для завершения процессов",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4266","Что делает скрипт","what-the-script-does",{"id":14,"value":15,"isTypeParagraph":8},"9824","Фрагмент получает строку из списка процессов `ps`, оставляет первую строку, где встречается шаблон из первого аргумента (`$1`), извлекает из этой строки PID и отправляет этому PID сигнал `TERM` (SIGTERM).  \nПо смыслу это попытка «корректно завершить один найденный процесс по подстроке/шаблону в его описании».",{"id":17,"description":18,"titleAlert":19,"isTypeAlertInfo":8},"607","Сигнал `SIGTERM` считается “мягкой” просьбой завершиться: процесс может обработать его, выполнить очистку (закрыть файлы, соединения) и завершить работу штатно.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4267","Пошаговый разбор","step-by-step-breakdown",{"id":25,"value":26,"isTypeParagraph":8},"9825","Ниже — тот же фрагмент, разложенный по шагам (по строкам):\n\n```\ntarget=$(ps -Af | grep $1 | head -n 1)\nspecific_target=$(awk '{print $2}' \u003C\u003C\u003C \"$target\")\nkill -s TERM $specific_target\n```\n\n1) `ps -Af` выводит список процессов; ключ `-A` означает «все процессы», а формат `-f` добавляет подробные колонки.  \n2) `grep $1` оставляет только строки, где встречается шаблон из первого аргумента скрипта (например, `nginx`, `node`, `python`).  \n3) `head -n 1` берёт только первую подходящую строку, даже если совпадений несколько.  \n4) `awk '{print $2}' \u003C\u003C\u003C \"$target\"` подаёт строку в `awk` через here-string `\u003C\u003C\u003C` и печатает второе поле этой строки.  \n5) `kill -s TERM $specific_target` отправляет процессу с этим PID сигнал `TERM`.",{"id":28,"value":29,"anchor":30,"isTypeH3":8},"4286","Поток данных (мини-схема)","data-flow-mini-diagram",{"id":32,"value":33,"isTypeParagraph":8},"9826","Поток данных через конвейер удобно представить так:\n\n```\nps -Af\n  │  (много строк: по строке на процесс)\n  ▼\ngrep \"$1\"\n  │  (строки, где есть совпадение)\n  ▼\nhead -n 1\n  │  (ровно одна строка)\n  ▼\nawk '{print $2}'\n  │  (PID из 2-го поля)\n  ▼\nkill -s TERM PID\n```\n",{"id":35,"value":36,"anchor":37,"isTypeH3":8},"4287","Таблица: что хранится в переменных","table-what-is-stored-in-variables",{"id":39,"value":40,"isTypeParagraph":8},"9827","| Переменная | Что содержит | Почему так |\n|---|---|---|\n| `target` | Одну строку из вывода `ps -Af`, первую совпавшую по `grep $1`. | Команда `head -n 1` ограничивает результат одной строкой. |\n| `specific_target` | Число PID (второе поле строки). | В `awk` `$2` — второе поле; во многих форматах `ps` PID находится во 2-й колонке. |",{"id":42,"value":43,"anchor":44,"isTypeH2":8},"4268","Теория: процессы, ps, awk, kill","theory-processes-ps-awk-kill",{"id":46,"value":47,"isTypeParagraph":8},"9828","PID (Process ID) — числовой идентификатор процесса, по нему операционная система и утилиты управления понимают, к какому именно процессу обращаться.  \n`kill` по назначению не «убивает», а отправляет сигнал: сигнал — это стандартный механизм уведомления процесса (например, «завершись», «перечитай конфигурацию» и т.д.).\n",{"id":49,"value":50,"anchor":51,"isTypeH3":8},"4288","Почему именно SIGTERM","why-sigterm",{"id":53,"value":54,"isTypeParagraph":8},"9829","`SIGTERM` предназначен для штатного завершения: приложение может перехватить сигнал, корректно остановиться и освободить ресурсы.  \nЕсли после `SIGTERM` процесс не завершается, иногда применяют `SIGKILL`, но он не даёт приложению выполнить очистку, потому что не может быть обработан программой.\n",{"id":56,"value":57,"anchor":58,"isTypeH3":8},"4289","Что такое here-string `\u003C\u003C\u003C`","what-is-a-here-string",{"id":60,"value":61,"isTypeParagraph":8},"9830","Оператор `\u003C\u003C\u003C` (here-string) — это способ передать строку как стандартный ввод команде справа, то есть как будто строка пришла из stdin.  \nВ данном фрагменте это позволяет не строить отдельный конвейер вида `echo \"$target\" | awk ...`, а передать строку в `awk` напрямую.\n\nПример идеи работы `\u003C\u003C\u003C`:\n\n```\nawk '{print $2}' \u003C\u003C\u003C \"alice 1234 extra\"\n```\n\nРезультатом будет `1234`, потому что печатается второе поле.",{"id":63,"value":64,"anchor":65,"isTypeH3":8},"4290","Что означает `$2` в awk","what-does-field-2-mean-in-awk",{"id":67,"value":68,"isTypeParagraph":8},"9831","В `awk` входная строка называется «записью», а поля внутри записи по умолчанию разделяются пробелами/табами: `$1` — первое поле, `$2` — второе, `$0` — вся строка целиком.  \nПоэтому конструкция `awk '{print $2}'` является типичным способом достать вторую колонку из «табличного» вывода, в том числе из `ps`.",{"id":70,"value":71,"anchor":72,"isTypeH2":8},"4269","Проблемы и улучшения","pitfalls-and-improvements",{"id":74,"value":75,"isTypeParagraph":8},"9832","В показанном виде фрагмент реализует общую идею (найти PID и отправить SIGTERM), но он уязвим к типичным проблемам надёжности.",{"id":77,"description":78,"titleAlert":19,"isTypeAlertWarning":8},"660","Конструкция `ps ... | grep ...` часто «находит саму себя»: в списке процессов появляется строка про `grep`, и она тоже может совпасть с шаблоном, из‑за чего будет выбран неверный PID.",{"id":80,"value":81,"isTypeParagraph":8},"9833","Основные практические проблемы:\n- Неэкранированный и некавыченный `$1`: `grep $1` подвергается разбиению на слова и интерпретации как регулярное выражение, поэтому шаблон с пробелами или спецсимволами может отработать неожиданно.\n- Выбор «первого попавшегося» процесса (`head -n 1`) не гарантирует, что будет выбран «нужный» экземпляр (если процессов несколько).\n- Возможен выбор PID самого `grep` (или другого случайного процесса), что делает поведение нестабильным.",{"id":83,"value":84,"anchor":85,"isTypeH3":8},"4291","Более надёжные варианты (концептуально)","more-reliable-options-conceptually",{"id":87,"value":88,"isTypeParagraph":8},"9834","1) Применение `pgrep/pkill` часто надёжнее, так как уменьшается объём ручного разбора текста и снижается риск «grep находит grep».  \n2) Применение форматированного вывода `ps` (например, выводить только PID и команду) уменьшает вероятность ошибочного извлечения колонки.\n\nПример подхода «минимум парсинга» через формат `ps` (показательный шаблон):\n\n```\nps -eo pid,args\n```\n\nПример отправки `TERM` (смысл совпадает с исходным `kill -s TERM PID`):\n\n```\nkill -s TERM 12345\n```",{"id":90,"description":91,"titleAlert":19,"isTypeAlertInfo":8},"608","Если требуется завершить программу «по имени», в Linux часто выбираются средства, которые сразу работают с именами/шаблонами (например, `pgrep/pkill`), чтобы не извлекать PID из «табличного» текста вручную.",{"id":93,"value":94,"isTypeParagraph":8},"9835","Кратко: фрагмент берёт первую строку процесса, совпавшую с `$1`, извлекает из неё PID как второе поле через `awk` и отправляет этому PID сигнал `SIGTERM` для корректного завершения, но при этом существует риск выбрать неверный процесс (например, сам `grep` или не тот экземпляр процесса).",{"id":96,"options":97,"hint":111,"solution":112,"description":113},"1118",[98,101,105,108],{"id":99,"label":100,"isCorrect":8},"4600","Скрипт ищет первый процесс, имя которого содержит значение первого аргумента, извлекает его PID и отправляет ему сигнал корректного завершения (SIGTERM)",{"id":102,"label":103,"isCorrect":104},"4601","Скрипт выводит список всех процессов, фильтрует его по первому аргументу, сохраняет весь вывод в файл и затем удаляет этот файл.",false,{"id":106,"label":107,"isCorrect":104},"4602","Скрипт запускает новый процесс с именем, переданным в первом аргументе, назначает ему идентификатор и останавливает его через пять секунд.",{"id":109,"label":110,"isCorrect":104},"4603","Скрипт мониторит нагрузку на систему, находит самый ресурсоемкий процесс и немедленно завершает его без возможности сохранения данных.","Необходимо проследить конвейер команд слева направо и понять, что именно попадает в переменные `target` и `specific_target`; ключевой факт — `$2` в `awk` означает «второе поле», а `kill -s TERM` отправляет сигнал `TERM` процессу с указанным PID.","**Правильный ответ: 1** -  скрипт ищет первый процесс, имя которого содержит значение первого аргумента, извлекает его PID и отправляет ему сигнал корректного завершения (SIGTERM).","Дан фрагмент Bash-скрипта. Что в нем происходит?\n\n```\ntarget=$(ps -Af | grep $1 | head -n 1)\nspecific_target=$(awk '{print $2}' \u003C\u003C\u003C \"$target\")\nkill -s TERM $specific_target\n```","quizQuestion",{"title":7,"description":116,"ogTitle":7,"ogDescription":116,"ogImageUrl":117,"canonical":19,"ogLocale":118,"ogSiteName":119,"ogImageType":120,"ogImageWidth":121,"ogImageHeight":122,"ogType":123,"ogUrl":19},"Пояснение фрагмента: ps+grep выбирает процесс, awk достаёт PID, kill отправляет TERM для корректного завершения.","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":125,"siteUrl":126},"GOOD WEB JOB!","https://goodwebjob.ru",{"slugs":128},[129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396,399,402,405,408,411,414,417,420,423,426,429,432,435,438,441,444,447,450],{"name":130,"value":131},"Теоретические задания","theoretical-tasks",{"name":133,"value":134},"Что вернёт этот код: typeof (function(){})()","what-this-code-will-return-typeof-function",{"name":136,"value":137},"С чего начать?","where-to-begin",{"name":139,"value":140},"Почему опасно писать прямо в прототипы базовых типов?","why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":142,"value":143},"Backend","backend",{"name":145,"value":146},"Frontend","frontend",{"name":148,"value":149},"Какие логические значения в console.log будут получены?","prototype-what-logical-values-will-be-received-in-console-log",{"name":151,"value":152},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":154,"value":155}," Найти в массиве неповторяющиеся числа","find-non-repeating-numbers-in-an-array",{"name":157,"value":158},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":160,"value":161},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":163,"value":164},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":166,"value":167},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":169,"value":170},"Какое значение выведет консоль с object.property?","what-value-will-the-console-output-with-object-property",{"name":172,"value":173},"Что выведется в console.log([arr[0](), arr[0]()])?","what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":175,"value":176},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":178,"value":179},"Необходимо проверить, являются ли две строки анаграммами друг друга","checks-whether-two-strings-are-anagrams-of-each-other",{"name":181,"value":182},"Определить, является ли слово палиндромом","determines-whether-a-word-is-a-palindrome",{"name":184,"value":185},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":187,"value":188},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":190,"value":191},"Дано дерево (вложенный объект), надо найти сумму всех вершин","given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":193,"value":194},"Для каждой ветви дерева записать номер вложенности данной ветви","for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":196,"value":197},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":199,"value":200},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":202,"value":203},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":205,"value":206},"Напишите функцию, который сделает из массива объект","write-a-function-that-will-make-an-object-out-of-an-array",{"name":208,"value":209},"Что выведет console.log в результате выполнения цикла while?","what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":211,"value":212},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":214,"value":215},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":217,"value":218},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":220,"value":221},"Уникализация значений в массиве","unifying-values-in-an-array",{"name":223,"value":224},"«Расплющивание» массива","flattening-the-array",{"name":226,"value":227},"Что вернёт метод book.getUpperName()?","what-will-the-book-get-upper-name-method-return",{"name":229,"value":230},"Сжатие строк","string-compression",{"name":232,"value":233},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":235,"value":236},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":238,"value":239},"Как браузер после ввода домена понимает, откуда брать сайт?","how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":241,"value":242},"Как домен попадает в DNS в таблицу соответствия: домен – ip","how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":244,"value":245},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":247,"value":248},"Ключевые отличия TCP и UDP","key-differences-between-tcp-and-udp",{"name":250,"value":251},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":253,"value":254},"Что такое HTTP и из чего состоит?","what-is-http-and-what-does-it-consist-of",{"name":256,"value":257},"Что такое заголовки в HTTP и зачем они нужны?","what-are-http-headers-and-why-do-we-need-them",{"name":259,"value":260},"Что такое параметры в HTTP?","what-are-http-parameters",{"name":262,"value":263},"Где находится HTML-код в структуре HTTP-ответа?","where-is-the-html-code-located-in-the-http-response-structure",{"name":265,"value":266},"Что такое HTML?","what-is-html",{"name":268,"value":269},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":271,"value":272},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":274,"value":275},"Что такое cookie?","what-is-a-cookie",{"name":277,"value":278},"Кто является инициатором записи cookie в браузере?","who-initiates-the-cookie-recording-in-the-browser",{"name":280,"value":281},"Есть ли возможность с клиента (с браузера) управлять cookie?","is-it-possible-to-manage-cookies-from-the-client-browser",{"name":283,"value":284},"Лайвкодинг","livecoding",{"name":286,"value":287},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":289,"value":290},"Всё, что идет по HTTPS – оно защищено?","is-everything-that-goes-through-https-secure",{"name":292,"value":293},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":295,"value":296},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":298,"value":299},"Как браузер парсит JavaScript и изображения при рендеринге?","how-the-browser-parses-javascript-and-images-when-rendering",{"name":301,"value":302},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":304,"value":305},"Что в браузере блокирует рендеринг страницы?","what-is-blocking-the-page-rendering-in-the-browser",{"name":307,"value":308},"Что такое DOM в браузере? Что такое CSSOM?","what-is-dom-in-a-browser-what-is-cssom",{"name":310,"value":311},"Что является узлами в DOM?","what-are-nodes-in-the-dom",{"name":313,"value":314},"Из чего состоит CSSOM?","what-does-cssom-consist-of",{"name":316,"value":317},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":319,"value":320},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":322,"value":323},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":325,"value":326},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":328,"value":329},"Есть HTML код. Будет ли font-weight на span влиять?","there-is-an-html-code-will-font-weight-affect-span",{"name":331,"value":332},"Flexbox и Grid, чем отличаются друг от друга?","what-are-the-differences-between-flexbox-and-grid",{"name":334,"value":335},"Заменяют ли Flexbox и Grid друг друга?","do-flexbox-and-grid-replace-each-other",{"name":337,"value":338},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":340,"value":341},"Сборник задач","tasks",{"name":343,"value":344},"Какие способы объявления функции есть в JavaScript?","what-are-the-ways-to-declare-a-function-in-javascript",{"name":346,"value":347},"Что такое this в JavaScript?","what-is-this-in-javascript",{"name":349,"value":350},"Что такое Event Loop, как работает?","what-is-an-event-loop-and-how-does-it-work",{"name":352,"value":353},"Что будет, если вызвать typeof на необъявленной переменной?","what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":355,"value":356},"Что показывает оператор typeof в JavaScript?","what-does-the-typeof-operator-show-in-javascript",{"name":358,"value":359},"Какие типы данных существует в JavaScript?","what-types-of-data-exist-in-javascript",{"name":361,"value":362},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":364,"value":365},"Что вернет typeof для массива?","what-will-typeof-return-for-an-array",{"name":367,"value":368},"Почему оператор typeof, применённый к массиву, возвращает объект?","why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":370,"value":371},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":373,"value":374},"Что возвращает typeof для new Set в JavaScript?","what-does-typeof-return-for-new-set-in-javascript",{"name":376,"value":377},"Для чего нужен React, какие он решает проблемы?","what-is-react-used-for-and-what-problems-does-it-solve",{"name":379,"value":380},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":382,"value":383},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":385,"value":386},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":388,"value":389},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":391,"value":392},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":394,"value":395},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":397,"value":398},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":400,"value":401},"Какие существуют стратегии ветвления для работы команды? Что это такое?","what-are-the-branching-strategies-for-the-team-what-is-it",{"name":403,"value":404},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":406,"value":407},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":409,"value":410},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":412,"value":413},"Что такое алгоритмическая сложность?","what-is-algorithmic-complexity",{"name":415,"value":416},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","what-is-the-algorithmic-complexity-of-quick-sort",{"name":418,"value":419},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":421,"value":422},"Каким способом может выполняться авторизация пользователя на сайте?","how-can-a-user-be-authorized-on-a-website",{"name":424,"value":425},"В чем разница между микро- и макро-тасками в JavaScript?","what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":427,"value":428},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":430,"value":431},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":433,"value":434},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":436,"value":437},"Подготовка к тех.интервью","technical-interview",{"name":439,"value":440},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":442,"value":443},"Что такое DNS, как DNS находит нужный IP-адрес?","what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":445,"value":446},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","variables-are-declared-as-follows-specify-the-correct-statement",{"name":448,"value":449},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":451,"value":452},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",[454],{"label":436,"slug":437,"to":455},"/technical-interview/where-to-begin",{"navigationList":457,"navigationSublist":463},[458,460],{"path":455,"isActive":104,"name":136,"icon":459,"isNavbarMobileDisabled":8},"material-symbols:visibility-outline-rounded",{"path":461,"isActive":8,"name":340,"icon":462,"isNavbarMobileDisabled":104},"/technical-interview/tasks","material-symbols:task-outline",[464,471,490,499,504,599,616,623,628,671,686,691],{"title":465,"list":466,"isOpened":104},"Bash",[467,469],{"name":406,"path":468,"isActive":104},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":409,"path":470,"isActive":104},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":472,"list":473,"isOpened":104},"CSS",[474,476,478,480,482,484,486,488],{"name":316,"path":475,"isActive":104},"/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":319,"path":477,"isActive":104},"/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":322,"path":479,"isActive":104},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":325,"path":481,"isActive":104},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":328,"path":483,"isActive":104},"/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":331,"path":485,"isActive":104},"/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":334,"path":487,"isActive":104},"/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":337,"path":489,"isActive":104},"/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":491,"list":492,"isOpened":104},"Git",[493,495,497],{"name":394,"path":494,"isActive":104},"/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":397,"path":496,"isActive":104},"/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":400,"path":498,"isActive":104},"/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":500,"list":501,"isOpened":104},"HTML",[502],{"name":265,"path":503,"isActive":104},"/technical-interview/tasks/what-is-html",{"title":505,"list":506,"isOpened":104},"JavaScript",[507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597],{"name":148,"path":508,"isActive":104},"/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":139,"path":510,"isActive":104},"/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":286,"path":512,"isActive":104},"/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":169,"path":514,"isActive":104},"/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":172,"path":516,"isActive":104},"/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":208,"path":518,"isActive":104},"/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":211,"path":520,"isActive":104},"/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":226,"path":522,"isActive":104},"/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":445,"path":524,"isActive":104},"/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":232,"path":526,"isActive":104},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":214,"path":528,"isActive":104},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":217,"path":530,"isActive":104},"/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":133,"path":532,"isActive":104},"/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":235,"path":534,"isActive":104},"/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":343,"path":536,"isActive":104},"/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":346,"path":538,"isActive":104},"/technical-interview/tasks/what-is-this-in-javascript",{"name":349,"path":540,"isActive":104},"/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":352,"path":542,"isActive":104},"/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":355,"path":544,"isActive":104},"/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":358,"path":546,"isActive":104},"/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":361,"path":548,"isActive":104},"/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":364,"path":550,"isActive":104},"/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":367,"path":552,"isActive":104},"/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":370,"path":554,"isActive":104},"/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":373,"path":556,"isActive":104},"/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":418,"path":558,"isActive":104},"/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":424,"path":560,"isActive":104},"/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":157,"path":562,"isActive":104},"/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":175,"path":564,"isActive":104},"/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":160,"path":566,"isActive":104},"/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":190,"path":568,"isActive":104},"/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":166,"path":570,"isActive":104},"/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":193,"path":572,"isActive":104},"/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":184,"path":574,"isActive":104},"/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":196,"path":576,"isActive":104},"/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":202,"path":578,"isActive":104},"/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":154,"path":580,"isActive":104},"/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":205,"path":582,"isActive":104},"/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":178,"path":584,"isActive":104},"/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":151,"path":586,"isActive":104},"/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":181,"path":588,"isActive":104},"/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":223,"path":590,"isActive":104},"/technical-interview/tasks/flattening-the-array",{"name":187,"path":592,"isActive":104},"/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":229,"path":594,"isActive":104},"/technical-interview/tasks/string-compression",{"name":220,"path":596,"isActive":104},"/technical-interview/tasks/unifying-values-in-an-array",{"name":199,"path":598,"isActive":104},"/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":600,"list":601,"isOpened":104},"React",[602,604,606,608,610,612,614],{"name":376,"path":603,"isActive":104},"/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":448,"path":605,"isActive":104},"/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":379,"path":607,"isActive":104},"/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":382,"path":609,"isActive":104},"/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":385,"path":611,"isActive":104},"/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":388,"path":613,"isActive":104},"/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":451,"path":615,"isActive":104},"/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":617,"list":618,"isOpened":104},"Алгоритмы",[619,621],{"name":412,"path":620,"isActive":104},"/technical-interview/tasks/what-is-algorithmic-complexity",{"name":415,"path":622,"isActive":104},"/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":624,"list":625,"isOpened":104},"Дебаггинг",[626],{"name":391,"path":627,"isActive":104},"/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":629,"list":630,"isOpened":104},"Компьютерные сети",[631,633,635,637,639,641,643,645,647,649,651,653,655,657,659,661,663,665,667,669],{"name":238,"path":632,"isActive":104},"/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":442,"path":634,"isActive":104},"/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":241,"path":636,"isActive":104},"/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":244,"path":638,"isActive":104},"/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":247,"path":640,"isActive":104},"/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":250,"path":642,"isActive":104},"/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":253,"path":644,"isActive":104},"/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":256,"path":646,"isActive":104},"/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":259,"path":648,"isActive":104},"/technical-interview/tasks/what-are-http-parameters",{"name":262,"path":650,"isActive":104},"/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":268,"path":652,"isActive":104},"/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":271,"path":654,"isActive":104},"/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":274,"path":656,"isActive":104},"/technical-interview/tasks/what-is-a-cookie",{"name":277,"path":658,"isActive":104},"/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":280,"path":660,"isActive":104},"/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":439,"path":662,"isActive":104},"/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":289,"path":664,"isActive":104},"/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":292,"path":666,"isActive":104},"/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":295,"path":668,"isActive":104},"/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":421,"path":670,"isActive":104},"/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":672,"list":673,"isOpened":104},"Отрисовка в браузере",[674,676,678,680,682,684],{"name":301,"path":675,"isActive":104},"/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":298,"path":677,"isActive":104},"/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":304,"path":679,"isActive":104},"/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":307,"path":681,"isActive":104},"/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":310,"path":683,"isActive":104},"/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":313,"path":685,"isActive":104},"/technical-interview/tasks/what-does-cssom-consist-of",{"title":687,"list":688,"isOpened":104},"Ревью кода",[689],{"name":403,"path":690,"isActive":104},"/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":692,"list":693,"isOpened":104},"Теория вероятности",[694,696,698],{"name":427,"path":695,"isActive":104},"/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":430,"path":697,"isActive":104},"/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":433,"path":699,"isActive":104},"/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"cooperation":701,"copyright":704,"reportError":705,"socialNetwork":707},{"link":702,"title":703},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":706,"link":702},"Сообщить об ошибке",{"label":708,"socialNetworkList":709},"Мы в соцсетях:",[710,713,716],{"icon":19,"link":711,"title":712},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":714,"link":702,"title":715},"ic:baseline-telegram","Telegram",{"icon":717,"link":718,"title":719},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":721,"body":722},{},{"type":723,"children":724},"root",[725,733],{"type":726,"tag":727,"props":728,"children":729},"element","p",{},[730],{"type":731,"value":732},"text","Дан фрагмент Bash-скрипта. Что в нем происходит?",{"type":726,"tag":734,"props":735,"children":739},"pre",{"className":736,"code":738,"language":731},[737],"language-text","target=$(ps -Af | grep $1 | head -n 1)\nspecific_target=$(awk '{print $2}' \u003C\u003C\u003C \"$target\")\nkill -s TERM $specific_target\n",[740],{"type":726,"tag":741,"props":742,"children":744},"code",{"__ignoreMap":743},"",[745],{"type":731,"value":738},{"data":747,"body":748},{},{"type":723,"children":749},[750],{"type":726,"tag":727,"props":751,"children":752},{},[753],{"type":731,"value":100},{"data":755,"body":756},{},{"type":723,"children":757},[758],{"type":726,"tag":727,"props":759,"children":760},{},[761],{"type":731,"value":103},{"data":763,"body":764},{},{"type":723,"children":765},[766],{"type":726,"tag":727,"props":767,"children":768},{},[769],{"type":731,"value":107},{"data":771,"body":772},{},{"type":723,"children":773},[774],{"type":726,"tag":727,"props":775,"children":776},{},[777],{"type":731,"value":110},{"data":779,"body":780},{},{"type":723,"children":781},[782],{"type":726,"tag":727,"props":783,"children":784},{},[785,787,793,795,801,803,809,811,817,819,825,827,833],{"type":731,"value":786},"Необходимо проследить конвейер команд слева направо и понять, что именно попадает в переменные ",{"type":726,"tag":741,"props":788,"children":790},{"className":789},[],[791],{"type":731,"value":792},"target",{"type":731,"value":794}," и ",{"type":726,"tag":741,"props":796,"children":798},{"className":797},[],[799],{"type":731,"value":800},"specific_target",{"type":731,"value":802},"; ключевой факт — ",{"type":726,"tag":741,"props":804,"children":806},{"className":805},[],[807],{"type":731,"value":808},"$2",{"type":731,"value":810}," в ",{"type":726,"tag":741,"props":812,"children":814},{"className":813},[],[815],{"type":731,"value":816},"awk",{"type":731,"value":818}," означает «второе поле», а ",{"type":726,"tag":741,"props":820,"children":822},{"className":821},[],[823],{"type":731,"value":824},"kill -s TERM",{"type":731,"value":826}," отправляет сигнал ",{"type":726,"tag":741,"props":828,"children":830},{"className":829},[],[831],{"type":731,"value":832},"TERM",{"type":731,"value":834}," процессу с указанным PID.",{"data":836,"body":837},{},{"type":723,"children":838},[839],{"type":726,"tag":727,"props":840,"children":841},{},[842,848],{"type":726,"tag":843,"props":844,"children":845},"strong",{},[846],{"type":731,"value":847},"Правильный ответ: 1",{"type":731,"value":849}," -  скрипт ищет первый процесс, имя которого содержит значение первого аргумента, извлекает его PID и отправляет ему сигнал корректного завершения (SIGTERM).",{"data":851,"body":852},{},{"type":723,"children":853},[854],{"type":726,"tag":727,"props":855,"children":856},{},[857,859,865,867,873,875,880,882,886],{"type":731,"value":858},"Фрагмент получает строку из списка процессов ",{"type":726,"tag":741,"props":860,"children":862},{"className":861},[],[863],{"type":731,"value":864},"ps",{"type":731,"value":866},", оставляет первую строку, где встречается шаблон из первого аргумента (",{"type":726,"tag":741,"props":868,"children":870},{"className":869},[],[871],{"type":731,"value":872},"$1",{"type":731,"value":874},"), извлекает из этой строки PID и отправляет этому PID сигнал ",{"type":726,"tag":741,"props":876,"children":878},{"className":877},[],[879],{"type":731,"value":832},{"type":731,"value":881}," (SIGTERM).",{"type":726,"tag":883,"props":884,"children":885},"br",{},[],{"type":731,"value":887},"\nПо смыслу это попытка «корректно завершить один найденный процесс по подстроке/шаблону в его описании».",{"data":889,"body":890},{},{"type":723,"children":891},[892],{"type":726,"tag":727,"props":893,"children":894},{},[895,897,903],{"type":731,"value":896},"Сигнал ",{"type":726,"tag":741,"props":898,"children":900},{"className":899},[],[901],{"type":731,"value":902},"SIGTERM",{"type":731,"value":904}," считается “мягкой” просьбой завершиться: процесс может обработать его, выполнить очистку (закрыть файлы, соединения) и завершить работу штатно.",{"data":906,"body":907},{},{"type":723,"children":908},[909,914,922],{"type":726,"tag":727,"props":910,"children":911},{},[912],{"type":731,"value":913},"Ниже — тот же фрагмент, разложенный по шагам (по строкам):",{"type":726,"tag":734,"props":915,"children":917},{"className":916,"code":738,"language":731},[737],[918],{"type":726,"tag":741,"props":919,"children":920},{"__ignoreMap":743},[921],{"type":731,"value":738},{"type":726,"tag":923,"props":924,"children":925},"ol",{},[926,954,988,999,1025],{"type":726,"tag":927,"props":928,"children":929},"li",{},[930,936,938,944,946,952],{"type":726,"tag":741,"props":931,"children":933},{"className":932},[],[934],{"type":731,"value":935},"ps -Af",{"type":731,"value":937}," выводит список процессов; ключ ",{"type":726,"tag":741,"props":939,"children":941},{"className":940},[],[942],{"type":731,"value":943},"-A",{"type":731,"value":945}," означает «все процессы», а формат ",{"type":726,"tag":741,"props":947,"children":949},{"className":948},[],[950],{"type":731,"value":951},"-f",{"type":731,"value":953}," добавляет подробные колонки.",{"type":726,"tag":927,"props":955,"children":956},{},[957,963,965,971,973,979,980,986],{"type":726,"tag":741,"props":958,"children":960},{"className":959},[],[961],{"type":731,"value":962},"grep $1",{"type":731,"value":964}," оставляет только строки, где встречается шаблон из первого аргумента скрипта (например, ",{"type":726,"tag":741,"props":966,"children":968},{"className":967},[],[969],{"type":731,"value":970},"nginx",{"type":731,"value":972},", ",{"type":726,"tag":741,"props":974,"children":976},{"className":975},[],[977],{"type":731,"value":978},"node",{"type":731,"value":972},{"type":726,"tag":741,"props":981,"children":983},{"className":982},[],[984],{"type":731,"value":985},"python",{"type":731,"value":987},").",{"type":726,"tag":927,"props":989,"children":990},{},[991,997],{"type":726,"tag":741,"props":992,"children":994},{"className":993},[],[995],{"type":731,"value":996},"head -n 1",{"type":731,"value":998}," берёт только первую подходящую строку, даже если совпадений несколько.",{"type":726,"tag":927,"props":1000,"children":1001},{},[1002,1008,1010,1015,1017,1023],{"type":726,"tag":741,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":731,"value":1007},"awk '{print $2}' \u003C\u003C\u003C \"$target\"",{"type":731,"value":1009}," подаёт строку в ",{"type":726,"tag":741,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":731,"value":816},{"type":731,"value":1016}," через here-string ",{"type":726,"tag":741,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":731,"value":1022},"\u003C\u003C\u003C",{"type":731,"value":1024}," и печатает второе поле этой строки.",{"type":726,"tag":927,"props":1026,"children":1027},{},[1028,1034,1036,1041],{"type":726,"tag":741,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":731,"value":1033},"kill -s TERM $specific_target",{"type":731,"value":1035}," отправляет процессу с этим PID сигнал ",{"type":726,"tag":741,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":731,"value":832},{"type":731,"value":1042},".",{"data":1044,"body":1045},{},{"type":723,"children":1046},[1047],{"type":726,"tag":727,"props":1048,"children":1049},{},[1050,1052,1055,1061],{"type":731,"value":1051},"PID (Process ID) — числовой идентификатор процесса, по нему операционная система и утилиты управления понимают, к какому именно процессу обращаться.",{"type":726,"tag":883,"props":1053,"children":1054},{},[],{"type":726,"tag":741,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":731,"value":1060},"kill",{"type":731,"value":1062}," по назначению не «убивает», а отправляет сигнал: сигнал — это стандартный механизм уведомления процесса (например, «завершись», «перечитай конфигурацию» и т.д.).",{"data":1064,"body":1065},{},{"type":723,"children":1066},[1067],{"type":726,"tag":1068,"props":1069,"children":1070},"table",{},[1071,1095],{"type":726,"tag":1072,"props":1073,"children":1074},"thead",{},[1075],{"type":726,"tag":1076,"props":1077,"children":1078},"tr",{},[1079,1085,1090],{"type":726,"tag":1080,"props":1081,"children":1082},"th",{},[1083],{"type":731,"value":1084},"Переменная",{"type":726,"tag":1080,"props":1086,"children":1087},{},[1088],{"type":731,"value":1089},"Что содержит",{"type":726,"tag":1080,"props":1091,"children":1092},{},[1093],{"type":731,"value":1094},"Почему так",{"type":726,"tag":1096,"props":1097,"children":1098},"tbody",{},[1099,1141],{"type":726,"tag":1076,"props":1100,"children":1101},{},[1102,1111,1129],{"type":726,"tag":1103,"props":1104,"children":1105},"td",{},[1106],{"type":726,"tag":741,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":731,"value":792},{"type":726,"tag":1103,"props":1112,"children":1113},{},[1114,1116,1121,1123,1128],{"type":731,"value":1115},"Одну строку из вывода ",{"type":726,"tag":741,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":731,"value":935},{"type":731,"value":1122},", первую совпавшую по ",{"type":726,"tag":741,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":731,"value":962},{"type":731,"value":1042},{"type":726,"tag":1103,"props":1130,"children":1131},{},[1132,1134,1139],{"type":731,"value":1133},"Команда ",{"type":726,"tag":741,"props":1135,"children":1137},{"className":1136},[],[1138],{"type":731,"value":996},{"type":731,"value":1140}," ограничивает результат одной строкой.",{"type":726,"tag":1076,"props":1142,"children":1143},{},[1144,1152,1157],{"type":726,"tag":1103,"props":1145,"children":1146},{},[1147],{"type":726,"tag":741,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":731,"value":800},{"type":726,"tag":1103,"props":1153,"children":1154},{},[1155],{"type":731,"value":1156},"Число PID (второе поле строки).",{"type":726,"tag":1103,"props":1158,"children":1159},{},[1160,1162,1167,1169,1174,1176,1181],{"type":731,"value":1161},"В ",{"type":726,"tag":741,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":731,"value":816},{"type":731,"value":1168}," ",{"type":726,"tag":741,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":731,"value":808},{"type":731,"value":1175}," — второе поле; во многих форматах ",{"type":726,"tag":741,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":731,"value":864},{"type":731,"value":1182}," PID находится во 2-й колонке.",{"data":1184,"body":1185},{},{"type":723,"children":1186},[1187,1192],{"type":726,"tag":727,"props":1188,"children":1189},{},[1190],{"type":731,"value":1191},"Поток данных через конвейер удобно представить так:",{"type":726,"tag":734,"props":1193,"children":1196},{"className":1194,"code":1195,"language":731},[737],"ps -Af\n  │  (много строк: по строке на процесс)\n  ▼\ngrep \"$1\"\n  │  (строки, где есть совпадение)\n  ▼\nhead -n 1\n  │  (ровно одна строка)\n  ▼\nawk '{print $2}'\n  │  (PID из 2-го поля)\n  ▼\nkill -s TERM PID\n",[1197],{"type":726,"tag":741,"props":1198,"children":1199},{"__ignoreMap":743},[1200],{"type":731,"value":1195},{"data":1202,"body":1203},{},{"type":723,"children":1204},[1205],{"type":726,"tag":727,"props":1206,"children":1207},{},[1208,1213,1215,1218,1220,1225,1227,1233],{"type":726,"tag":741,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":731,"value":902},{"type":731,"value":1214}," предназначен для штатного завершения: приложение может перехватить сигнал, корректно остановиться и освободить ресурсы.",{"type":726,"tag":883,"props":1216,"children":1217},{},[],{"type":731,"value":1219},"\nЕсли после ",{"type":726,"tag":741,"props":1221,"children":1223},{"className":1222},[],[1224],{"type":731,"value":902},{"type":731,"value":1226}," процесс не завершается, иногда применяют ",{"type":726,"tag":741,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":731,"value":1232},"SIGKILL",{"type":731,"value":1234},", но он не даёт приложению выполнить очистку, потому что не может быть обработан программой.",{"data":1236,"body":1237},{},{"type":723,"children":1238},[1239,1271,1283,1292],{"type":726,"tag":727,"props":1240,"children":1241},{},[1242,1244,1249,1251,1254,1256,1262,1264,1269],{"type":731,"value":1243},"Оператор ",{"type":726,"tag":741,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":731,"value":1022},{"type":731,"value":1250}," (here-string) — это способ передать строку как стандартный ввод команде справа, то есть как будто строка пришла из stdin.",{"type":726,"tag":883,"props":1252,"children":1253},{},[],{"type":731,"value":1255},"\nВ данном фрагменте это позволяет не строить отдельный конвейер вида ",{"type":726,"tag":741,"props":1257,"children":1259},{"className":1258},[],[1260],{"type":731,"value":1261},"echo \"$target\" | awk ...",{"type":731,"value":1263},", а передать строку в ",{"type":726,"tag":741,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":731,"value":816},{"type":731,"value":1270}," напрямую.",{"type":726,"tag":727,"props":1272,"children":1273},{},[1274,1276,1281],{"type":731,"value":1275},"Пример идеи работы ",{"type":726,"tag":741,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":731,"value":1022},{"type":731,"value":1282},":",{"type":726,"tag":734,"props":1284,"children":1287},{"className":1285,"code":1286,"language":731},[737],"awk '{print $2}' \u003C\u003C\u003C \"alice 1234 extra\"\n",[1288],{"type":726,"tag":741,"props":1289,"children":1290},{"__ignoreMap":743},[1291],{"type":731,"value":1286},{"type":726,"tag":727,"props":1293,"children":1294},{},[1295,1297,1303],{"type":731,"value":1296},"Результатом будет ",{"type":726,"tag":741,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":731,"value":1302},"1234",{"type":731,"value":1304},", потому что печатается второе поле.",{"data":1306,"body":1307},{},{"type":723,"children":1308},[1309],{"type":726,"tag":727,"props":1310,"children":1311},{},[1312,1313,1318,1320,1325,1327,1332,1334,1340,1342,1345,1347,1353,1355,1360],{"type":731,"value":1161},{"type":726,"tag":741,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":731,"value":816},{"type":731,"value":1319}," входная строка называется «записью», а поля внутри записи по умолчанию разделяются пробелами/табами: ",{"type":726,"tag":741,"props":1321,"children":1323},{"className":1322},[],[1324],{"type":731,"value":872},{"type":731,"value":1326}," — первое поле, ",{"type":726,"tag":741,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":731,"value":808},{"type":731,"value":1333}," — второе, ",{"type":726,"tag":741,"props":1335,"children":1337},{"className":1336},[],[1338],{"type":731,"value":1339},"$0",{"type":731,"value":1341}," — вся строка целиком.",{"type":726,"tag":883,"props":1343,"children":1344},{},[],{"type":731,"value":1346},"\nПоэтому конструкция ",{"type":726,"tag":741,"props":1348,"children":1350},{"className":1349},[],[1351],{"type":731,"value":1352},"awk '{print $2}'",{"type":731,"value":1354}," является типичным способом достать вторую колонку из «табличного» вывода, в том числе из ",{"type":726,"tag":741,"props":1356,"children":1358},{"className":1357},[],[1359],{"type":731,"value":864},{"type":731,"value":1042},{"data":1362,"body":1363},{},{"type":723,"children":1364},[1365],{"type":726,"tag":727,"props":1366,"children":1367},{},[1368],{"type":731,"value":75},{"data":1370,"body":1371},{},{"type":723,"children":1372},[1373],{"type":726,"tag":727,"props":1374,"children":1375},{},[1376,1378,1384,1386,1392],{"type":731,"value":1377},"Конструкция ",{"type":726,"tag":741,"props":1379,"children":1381},{"className":1380},[],[1382],{"type":731,"value":1383},"ps ... | grep ...",{"type":731,"value":1385}," часто «находит саму себя»: в списке процессов появляется строка про ",{"type":726,"tag":741,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":731,"value":1391},"grep",{"type":731,"value":1393},", и она тоже может совпасть с шаблоном, из‑за чего будет выбран неверный PID.",{"data":1395,"body":1396},{},{"type":723,"children":1397},[1398,1403],{"type":726,"tag":727,"props":1399,"children":1400},{},[1401],{"type":731,"value":1402},"Основные практические проблемы:",{"type":726,"tag":1404,"props":1405,"children":1406},"ul",{},[1407,1426,1438],{"type":726,"tag":927,"props":1408,"children":1409},{},[1410,1412,1417,1419,1424],{"type":731,"value":1411},"Неэкранированный и некавыченный ",{"type":726,"tag":741,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":731,"value":872},{"type":731,"value":1418},": ",{"type":726,"tag":741,"props":1420,"children":1422},{"className":1421},[],[1423],{"type":731,"value":962},{"type":731,"value":1425}," подвергается разбиению на слова и интерпретации как регулярное выражение, поэтому шаблон с пробелами или спецсимволами может отработать неожиданно.",{"type":726,"tag":927,"props":1427,"children":1428},{},[1429,1431,1436],{"type":731,"value":1430},"Выбор «первого попавшегося» процесса (",{"type":726,"tag":741,"props":1432,"children":1434},{"className":1433},[],[1435],{"type":731,"value":996},{"type":731,"value":1437},") не гарантирует, что будет выбран «нужный» экземпляр (если процессов несколько).",{"type":726,"tag":927,"props":1439,"children":1440},{},[1441,1443,1448],{"type":731,"value":1442},"Возможен выбор PID самого ",{"type":726,"tag":741,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":731,"value":1391},{"type":731,"value":1449}," (или другого случайного процесса), что делает поведение нестабильным.",{"data":1451,"body":1452},{},{"type":723,"children":1453},[1454],{"type":726,"tag":727,"props":1455,"children":1456},{},[1457,1459,1465],{"type":731,"value":1458},"Если требуется завершить программу «по имени», в Linux часто выбираются средства, которые сразу работают с именами/шаблонами (например, ",{"type":726,"tag":741,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":731,"value":1464},"pgrep/pkill",{"type":731,"value":1466},"), чтобы не извлекать PID из «табличного» текста вручную.",{"data":1468,"body":1469},{},{"type":723,"children":1470},[1471,1498,1510,1519,1539],{"type":726,"tag":923,"props":1472,"children":1473},{},[1474,1486],{"type":726,"tag":927,"props":1475,"children":1476},{},[1477,1479,1484],{"type":731,"value":1478},"Применение ",{"type":726,"tag":741,"props":1480,"children":1482},{"className":1481},[],[1483],{"type":731,"value":1464},{"type":731,"value":1485}," часто надёжнее, так как уменьшается объём ручного разбора текста и снижается риск «grep находит grep».",{"type":726,"tag":927,"props":1487,"children":1488},{},[1489,1491,1496],{"type":731,"value":1490},"Применение форматированного вывода ",{"type":726,"tag":741,"props":1492,"children":1494},{"className":1493},[],[1495],{"type":731,"value":864},{"type":731,"value":1497}," (например, выводить только PID и команду) уменьшает вероятность ошибочного извлечения колонки.",{"type":726,"tag":727,"props":1499,"children":1500},{},[1501,1503,1508],{"type":731,"value":1502},"Пример подхода «минимум парсинга» через формат ",{"type":726,"tag":741,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":731,"value":864},{"type":731,"value":1509}," (показательный шаблон):",{"type":726,"tag":734,"props":1511,"children":1514},{"className":1512,"code":1513,"language":731},[737],"ps -eo pid,args\n",[1515],{"type":726,"tag":741,"props":1516,"children":1517},{"__ignoreMap":743},[1518],{"type":731,"value":1513},{"type":726,"tag":727,"props":1520,"children":1521},{},[1522,1524,1529,1531,1537],{"type":731,"value":1523},"Пример отправки ",{"type":726,"tag":741,"props":1525,"children":1527},{"className":1526},[],[1528],{"type":731,"value":832},{"type":731,"value":1530}," (смысл совпадает с исходным ",{"type":726,"tag":741,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":731,"value":1536},"kill -s TERM PID",{"type":731,"value":1538},"):",{"type":726,"tag":734,"props":1540,"children":1543},{"className":1541,"code":1542,"language":731},[737],"kill -s TERM 12345\n",[1544],{"type":726,"tag":741,"props":1545,"children":1546},{"__ignoreMap":743},[1547],{"type":731,"value":1542},{"data":1549,"body":1550},{},{"type":723,"children":1551},[1552],{"type":726,"tag":727,"props":1553,"children":1554},{},[1555,1557,1562,1564,1569,1571,1576,1578,1583],{"type":731,"value":1556},"Кратко: фрагмент берёт первую строку процесса, совпавшую с ",{"type":726,"tag":741,"props":1558,"children":1560},{"className":1559},[],[1561],{"type":731,"value":872},{"type":731,"value":1563},", извлекает из неё PID как второе поле через ",{"type":726,"tag":741,"props":1565,"children":1567},{"className":1566},[],[1568],{"type":731,"value":816},{"type":731,"value":1570}," и отправляет этому PID сигнал ",{"type":726,"tag":741,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":731,"value":902},{"type":731,"value":1577}," для корректного завершения, но при этом существует риск выбрать неверный процесс (например, сам ",{"type":726,"tag":741,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":731,"value":1391},{"type":731,"value":1584}," или не тот экземпляр процесса).",1775735655417]