Home
dump -0f - /dev/mind
Баечки о мобильной связи (GSM, CDMA) и IT индустрии
11:14 PM (леденящая душу история) 
24th-Sep-2006 10:32 pm
Был обычный вечер обычного осеннего рабочего дня, спокойный, тёплый, ненапряжный. Падали листья с каштанов за окном, падали зелёные буквы скрин-сейвера в стиле "Матрица форевер", где-то далеко за океаном тихо падал индекс Доу-Джонса, падала среднесуточная температура, а с крыши парадного соседнего дома упал потянувшийся во сне кот. Нарушая эту вертикальную идиллию, не падали только сервера одной известной компании Z.

Криворукие программисты пытались валить их и глючными программами, и неоптимизированными запросами. Глупые пользователи пытались валить их странными запросами и бесконечными refresh-ами. Но сервера компании Z стояли насмерть.

Происходило это потому, что в компании Z была очень опытная "дежурная смена". Денно и нощно следили они за тем, чтобы все работало без сбоев и остановов. Все, что можно было "обнюхать" по SNMP - мониторилось, а где не было SNMP - были самописанные скрипты и программки, сводящие все жизненные показатели на большой монитор, на манер того, который можно увидеть в телевизоре, когда показывают центр управления полётами. Впрочем, я хотел рассказать не об этом ...

Вы замечали, что в жизни IT-специалистов поход на кухню за чашкой чая или кофе частенько играет прямо-таки судьбоносную роль, причем - не обязательно положительную? Именно во время вылазок на кухню в голову приходят судьбоносные идеи, тут обсуждаются самые сложные проблемы, но в то же время именно тут садятся пятна на новые джинсы, происходят Попадания На Глаза Злому Боссу и наполняются Роковые Чашки, которые затем опорожняются в клавиатуры и мониторы.

Также во время кухонных походов имеют обыкновение начинаться Большие Неприятности. Они подгадывают вое начало таким образом, чтобы вы, успели вернуться с чашкой тёплого ароматного напитка, разместить своё тело на стуле и сделать первый глоток, и тут - BANG! - "Houston, we've got a problem".

Об одной из таких неприятностей и пойдет речь.

В тот роковой день, в 23:09, ночной дежурный (назовем его, пожалуй, Марвин) окинул взглядом экран текущих alarm-ов и предупреждений ("все ОК") и пошёл налить себе ещё кофе. Вернувшись, он успел опустошить чашку примерно наполовину, прежде чем заметил, что "дело пахнет керосином". Судя по показаниям мониторов, стремительно росло количество необработанных запросов, которые система А не могла отправить системе B.

"Странно, неужели проспали переполнение дискового пространства у системы B? Или оракловую базу забили под завязку?". Марвин вызвал на экран соответствующие показатели и задумался. "Процент утилизации дискового пространства - 0%, размер БД - неизвестен, оракл недоступен".

Похоже, все было серьёзнее, чем казалось с первого взгляда. Что-то было не в порядке с системой B. Марвин открыл сеанс удалённого администрирования системы B (ssh root@systemb.z , su - systemb) и вывел список всех имеющихся директорий и файлов, т.к. наизусть средств администрирования системы B он не помнил. К его ужасу, вместо списка он увидел следующее:


systemb@systemb:~$ ls -l
total 0


Ни тебе файлов, ни тебе директорий. Ничего. Систему B как будто корова языком слизала. Марвина прошиб холодный пот, позабытый кофе тихонько остывал на краю стола. "Почему я? Почему именно на моей смене? Куда все делось? Кто виноват? Что делать?".

Последний вопрос был самым простым - надо было восстанавливать систему B из backup-ов, чем Марвин и занялся, решив отложить поиск ответов на все прочие вопросы на потом. Процесс восстановления затянулся до утра, но в конце-концов система B запустилась и заработала, как будто ничего особенного и не происходило. Довольный Марвин сделал запись в журнал, рассказал все сменщику и пошёл домой спать.

Сменщик пытался найти какие-то следы и причины, не накопал ничего особенного, а потом навалилась "текучка" и он забыл про ночное происшествие. Все сотрудники, имеющие доступ к системе B, клялись и божились, что "ничего не трогали". Странный инцидент обсудили на кухнях, но уже к вечеру жизнь вкатилась в привычную колею.

Ни завтра, ни послезавтра в поведении системы B не наблюдалось никаких заметных отклонений от нормы. А вечером третьего дня на ночную смену вышел Марвин, работавший по ночам в режиме "сутки через двое".

В 23:00 он чатился по Jabber со старым знакомым, периодически поглядывая на экран мониторинга. В 23:20 он пережил чёткое ощущение deja vu - растущая очередь запросов, 100% свободного дискового пространства, пропавшая с лица земли система В. Дальше - восстановление из backup-а (которое прошло гораздо быстрее, чем в первый раз), запись в журнале, доклад пришедшему на работу начальству, 30-минутный brainstorm-инг, не давший результатов, домой, спать. На кухне обсудили сложившуюся ситуацию и решили, что Марвин - парень неплохой, но дыма без огня не бывает. Уж больно подозрительно совпадало падение системы В с его ночными дежурствами.

Следующие два дня система В вела себя образцово.

На третий день Марвин опять выходил на работу в ночную смену. Первым делом он проверил, что система В - на месте. Система В как ни в чем не бывало перерабатывала байтики. Впрочем, расслабляться не стоило - до 23:00 было ещё далеко. Марвин исследовал crontab пользователя systemb, но не нашёл там ничего подозрительного. Более того - последний раз список периодически выполняемых процессов правили где-то год тому назад и запускались из него исключительно служебные скрипты системы В. Марвин исследовал историю логинов на сервер, но не обнаружил ничего подозрительного. Он исследовал системный crontab и crontab-ы других пользователей. Ничего. Он стал вычитывать служебные скрипты системы В. Все выглядело абсолютно нормально. Но Марвин понимал - если и сегодня система В упадет, ему будет очень сложно объяснить, что он не при чем.

В 23:00 Марвин запустил top и vmstat и твёрдо вознамерился поймать супостата.

23:05 ... 23:10 ... 23:14 ... Ага! Дисковая активность по vmstat, а в списке процессов появился rm! Марвин быстро "заморозил" его (kill -STOP) и начал искать, откуда он был запущен ... Система В была спасена.

Разгадка оказалось простой. Каждые три дня в 23:14 из crontab-а системы В запускался скрипт cleanup.sh, который (как видно из названия) занимался чисткой дискового пространства. Кто-то из администраторов системы В увидел, что одна из множества директорий с log-файлами архивируется, но почему-то не очищается и решил исправить этот досадный пробел. Тем более, что он собирался в отпуск и не хотел, чтобы в его отсутствие у системы В закончилось место на диске. Он нашёл нужное место в скрипте и дописал:


rm -rf system/logfiles/otherlogs/someobscurelogs/ *


Дописал, и уехал в отпуск.

Ненужный пробел перед '*' привел к тому, что эта конструкция тихо и аккуратно сносила подчистую всю систему В. Раз в три дня. Как раз во время ночных дежурств Марвина.

Мораль: не занимайтесь last-minute fixes в продуктивных системах перед уходом в отпуск; тестируйте; храните код в системе контроля версий.
Comments 
24th-Sep-2006 07:42 pm (UTC)
не занимайтесь last-minute fixes в продуктивных системах перед
уходом в отпуск


У меня с завтрашнего дня отпуск и я сегодня ваял программу. ;)
25th-Sep-2006 11:02 am (UTC)
А эта программа обеспечивает бесперебойный сервис какому-то кол-ву живых людей/других систем? :)
25th-Sep-2006 01:26 pm (UTC)
Nope. Тем не менее. ;)
24th-Sep-2006 07:46 pm (UTC)
Дааа, ужос %)
Эт хорошо что бекапы есть - но всеравно ж куча всего потерялась, что между бекапами...
24th-Sep-2006 07:47 pm (UTC)
Ужас какой.
На месте Марвина меня бы кондрат обхватил.
24th-Sep-2006 07:51 pm (UTC)
:) в code wtf!

а вообще конечно, феерический нереальный censored :)
24th-Sep-2006 08:54 pm (UTC)
И правда - леденящая. Почти как Чорный Лёд.
24th-Sep-2006 09:30 pm (UTC)
Дык, тестить надо такое. Желательно, не в продакшене :)
24th-Sep-2006 09:35 pm (UTC)
А разве юникс не блокирует удаление открытых файлов? По идее снести систему таким образом полностью не получиться.
25th-Sep-2006 04:07 am (UTC)
Не блокирует. Но, фактически файл не удаляет, пока все процессы его не отпустят.

В fido7 описывались случаи, когда работающую систему сносили rm -rf / и восстанавливали без перезагрузки.
25th-Sep-2006 11:05 am (UTC)
Хм. Для того, чтобы восстановиться, надо иметь запущенным что-то, что позволить "вытянуть себя за волосы". Какой-нибудь busybox, ftp или что-то подобное. Возможно, но маловероятно :)
25th-Sep-2006 03:45 pm (UTC)
sshd (для scp/sftp).
26th-Sep-2006 10:32 pm (UTC)
Мда? Не верю.

/etc/shadow и PAM он откуда возьмет, на голом диске-то?
25th-Sep-2006 11:03 am (UTC)
Как раз unix-ы и не блокируют. За что им честь и хвала. Систему получится снести "на ура".

Те програмы, которым не требуется периодическое обращение к диску (типа /bin/init) даже будут продолжать нормально работать :)
26th-Sep-2006 09:41 am (UTC)
> Как раз unix-ы и не блокируют. За что им честь и хвала.

FreeBSD6 на 'rm -rf /' захочет ещё одно подтверждение (are you sure?)
24th-Sep-2006 11:00 pm (UTC)
Да, хорошей истории -- хорошее изложение.
25th-Sep-2006 04:54 am (UTC)
Anonymous
Самая песня - это когда в пятницу сисадмин ISP решает что-нибудь "улучшить", и потом с чувством выполненного долга уходит до понедельника, оставляя все на не самом квалифицированном дежурном... Перед выходными и перед самой длинной ночью в году (с 31 декабря по ~10 января) нужно вообще запрещать трогать работающие системы.
25th-Sep-2006 04:57 am (UTC)
забыл войти.
25th-Sep-2006 03:47 pm (UTC)
Вызвать такого админа до понедельника (возможно даже ночью) религия мешает?
25th-Sep-2006 04:00 pm (UTC)
В общем случае он может быть не в состоянии - на природе, пьяный или еще в каком состоянии, т.к. личное время. Если не договаривались изначально о "приезде по звонку", то может и обломиться.
25th-Sep-2006 05:20 pm (UTC)
Если не договаривались изначально о "приезде по звонку", то может и обломиться.

Тогда в лучшем случае попадет на бабло.
26th-Sep-2006 02:38 am (UTC)
Упавшему сервису от этого легче не станет 8)
25th-Sep-2006 11:00 am (UTC)
Ага. При этом я уже не раз сталкивался с тем, что опытные, вобщем-то, менеджеры настаивают на том, чтобы продукт, завершенный в пятницу, запускать в пятницу, а не в понедельник.....
25th-Sep-2006 05:50 am (UTC)
Полгода назад наблюдал ситуацию: chown -R foouser /var/www/foo.example.com [пробел] /
Разумеетрся, лишний пробел был опечаткой, а сервер был боевым. Backup'ов не было. Два дня чинили.

После длительного разбирательства и взаимных обвинений ("а ты не говори под руку!") вину возложили на неудобную клавиатуру ноутбука :)
25th-Sep-2006 11:01 am (UTC)
chmod -x /bin/chmod ? :)
25th-Sep-2006 04:14 pm (UTC)
Людская безалаберность сильнее любых технических средств защиты.

Более-менее помогают только 3 заповеди сисадмина:
1. backup
2. backup
3. backup
25th-Sep-2006 08:32 pm (UTC)
Кстати, для восстановления работоспособности chmod после такого финта ушами как-то насобирали около 10 более-менее работающих рецептов.

Я сейчас вспомню только один:


/bin/ld-linux.so /bin/chmod +x /bin/chmod


Но все остальные были на порядок интереснее...
26th-Sep-2006 02:36 am (UTC)
Забавная задача.

Кстати, в копилочку неудачных опечаток - вместо find ./ -type f -exec chmod 600 {} \; однажды человек сделал find / -type f -exec chmod 600 {} \;
Чинили пол-дня, ладно рядом почти идентичная система была...
26th-Sep-2006 09:41 am (UTC)
Если фря то /usr/bin/install спасёт всех:))
25th-Sep-2006 11:01 am (UTC)
Хммм... интересно, спасает ли от 90% последствий что-то вроде:

dpkg --get-selections | xargs -i apt-get install --reinstall {}

?
25th-Sep-2006 06:37 pm (UTC)
Именно на той машине не помогло бы - там была FreBSD 6.x, половина софта собрана из портов, три десятка живых пользователей и всё такое :)
25th-Sep-2006 06:07 am (UTC)
О! Я угадал, что сервера :)
25th-Sep-2006 07:44 am (UTC)
да уж, знакомо..
25th-Sep-2006 09:21 am (UTC)
жуть
25th-Sep-2006 09:56 am (UTC)
А нех запускать на пашущей машине непротестированные скрипты! Нах!
25th-Sep-2006 05:24 pm (UTC)
systemb@systemb:~$ ls -l
total 0


Не домашний ли каталог он просматривает? Он вполне может быть пустым. Или тут в конце пропущена / или одна ошибка наложилась на другую и был получен искомый результат.
26th-Sep-2006 05:47 am (UTC)
А хоть бы и домашний. Патч Бармина унесёт и его.
26th-Sep-2006 10:32 pm (UTC)
Домашний каталог того юзера, от которого крутится система и в хоуме которого она стоит, ага.

Вендоры, которые подороже, очень такие решения любят. Чтобы, значит, все было contained и manageable.
26th-Sep-2006 04:26 am (UTC)
Мораль: надо держать нормальных специалистов, которые такого не допустят.
26th-Sep-2006 10:31 pm (UTC)
Надо, конечно же надо.

Мне тоже кажется, что в каждый человек должен быть на все руки мастер, и притом - непогрешимо правильный. А за саппорт должны отвечать люди, имеющие по 5 лет опыта за каждой строчкой в CV. И для тестирования любой ерунды должно быть время, тестеры, тестовые системы, спецификации...

Одна проблема - дороговато получается. Плюс - опять же проблема с тем, кто будет "сторожить сторожей", сиречь - проверять, что нормальные специалисты таки ничего не допустили ...
26th-Sep-2006 05:49 am (UTC)
Ситуация наверняка реальная, но слишком тупая. А вот как было у меня: некий предшественник напейсал скрипт такого плана:


cd DIR1
find .... удалить
cd
cd DIR2
find .... удалить
cd
cd DIR3
find .... удалить
cd


Всё было хорошо до тех пор пока DIR2 не был удалён со всей подсистемой которая его использовала...
26th-Sep-2006 08:16 am (UTC)
set -e в начало скрипта, натурально.
Если скриптописатель не обладает чутьём - почти обязательно.
Не знаю, насколько переносимо - bash точно умеет.
26th-Sep-2006 09:39 am (UTC)
Про -e знаю, переносимо, задним числом мы все умные:) А вот тот кто это писал - сильно упустил.
28th-Sep-2006 12:12 pm (UTC)
Классика! У знакомого было проще, многие годы из-под рута запускался скрпит, который помимо прочего, чистил раз в неделю мусор в каталоге, типа cd /tmp/fax rm *
Мусорный каталог кто-то пофиксил, как неиспользуемый, и *nix вместе с приложением исчезал на глазах изумленных админов с завидной периодичностью :-)
This page was loaded Dec 9th 2009, 7:10 pm GMT.