Наверняка хоть раз многие задавали себе вопрос, глядя на выдачу команды ps ax, что это загадочные zombie процессы. Их пытаешься удалить (буквально убить) командой kill, но они остаются целыми и невредимыми.
10310 ? Z 0:00 [php <defunct>]
10316 ? Z 0:00 [php <defunct>]
10352 ? Z 0:00 [php <defunct>]
На самом деле зомби уже уничтоженные процессы. А, как известно, нельзя убить дважды :). Ранее для них уже была выполнена команда kill, но, по разным причинам, она не смогла завершиться завершением процесса. Он остается формально существующим, но ресурсы, отведенные для него, на самом деле, освобождаются. Причина существования zombie процессов заключается в том, что родительский процесс может запросить статус завершения или затребовать статистику использования ресурсов порожденного зомби. В случае, если процесс-родитель не нуждается больше в зомби, он сигнализирует об этом операционной системе с помощью вызова системной функции wait().
В нормальной ситуации, когда процесс завершается, все его child processes становятся наследниками init, PID которого равен 1. Init всегда ждёт завершения child processes, для того, чтобы избежать порождения зомби.
Если всё же в вашей системе завелись зомби, это означает, что они не обслуживают более свои родительские процессы (определить, кстати, которые можно командой ps -lax, колонка PPID):
[user1@www user1]$ ps -lax
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 0 10302 1 15 0 29420 8132 - S ? 0:06 /usr/local/bin/ruby /var/www/site/public/dispatch.fcgi
0 0 10310 10302 15 0 0 0 - Z ? 0:00 [php <defunct>]
0 0 10316 10301 15 0 0 0 - Z ? 0:00 [php <defunct>]
В этом случае у вас есть три варианта: (1) исправить процесс родитель; (2) убить его; (3) или продолжать жить с этим. Надо заметить, что жить с этим не так уж и сложно, поскольку зомби - это всего лишь дополнительная строчка в выдаче команды ps .
Многие современные Linux дистрибутивы имеют в своем составе программы с довольно дружественным интерфейсом для установки часового пояса. Часто эта функция доступна через программное меню или простым нажатием правой кнопки мыши на иконке с изображением часов в известных графических средах, таких как KDE или GNOME. Но зачастую, приходится работать в режиме терминала, где нет доступа к удобной функциональности графического интерфейса. В этом случае часовой пояс устанавливается с помощью команд Linux и весь процесс состоит из нескольких простых шагов:
1. Заходим в систему как root, проверяем текущий часовой пояс, установленный на машине. Для этого выполняем команду date. На экране появится что-то типа:
Tue Feb 17 23:31:00 CST 2009
В данном случае CST и есть наш текущий часовой пояс.
2. Зайдя в директорию /usr/share/zoneinfo мы увидим список регионов, из которых можно выбрать наиболее подходящий для нас. Допустим, мы хотим переключиться на часовой пояс Москвы. Для этого нам нужно использовать файл Moscow, находящийся в поддиректории Europe.
3. На всякий случай делаем резервную копию файла с текущими настройками:
mv /etc/localtime /etc/localtime-old
4. Создаем символическую ссылку на нужный нам timezone:
7. В принципе, на этом все необходимые изменения можно считать законченными. Правда вместе с изменением часового пояса у нас «съехало» и текущее время:
Wed Feb 18 08:32:05 MSK 2009
Установим правильные значения для даты и времени, используя команду date:
Анализируя информацию о статистике использования моего блога, я обнаружил, что ежедневно с конкретных хостов происходит подозрительно бурная активность, характерная скорее для роботов или пауков чем для реальных пользователей.
Кроме того, что эта информация искажала общие данные статистики использования ресурса, к тому же я получал приличный объем зарубежного трафика, за который при определенных условиях приходится платить отдельно.
Я решил найти простое и действенное средство защиты от паразитного трафика, которое, по возможности, должно базироваться на стандартных утилитах LINUX. Для себя я выделил несколько подходов:
Блокировать “плохие” хосты на уровне приложения;
Использовать стандартные средства вэб-сервера Apache или lighttpd;
Настроить правила утилиты iptables, которая присутствует во всех LINUX дистрибутивах, базирующихся на ядрах 2.4.x или 2.6.x
Первые два способа были исключены из рассмотрения, поскольку здесь существует определённая привязка к приложению или к конкретному web-серверу. И если, например, Apache будет заменён на ngnix, придется заново прописывать блокирующие правила. К тому же, паразитные пакеты будут доходить до вэб сервера и приложения, дополнительно загружая их.
Используя утилиту iptables достаточно просто можно настроить набор правил для блокирования, а также получить средство для накопления и просмотра статистики по созданным правилам.
Настройка правил iptables
Процесс настройки достаточно простой и занимает несколько минут. Надо заметить, что Вы должны зайти на сервер как root пользователь или использовать команду sudo для добавления правил.
Итак, у нас есть конкретный хост (crawler.bloglines.com, IP=65.214.44.29) и целая подсеть (84.110.0.0), которые надо забанить. Правила выглядят так:
#Crawler bloglines
/sbin/iptables -A INPUT -s 65.214.44.29 -p tcp -m multiport --dports 80 -j DROP
#bzq-*.red.bezeqint.net
/sbin/iptables -A INPUT -s 84.110.0.0/255.255.0.0 -p tcp -m multiport --dports 80 -j DROP
Для других хостов или подсетей в правилах iptables, меняется только IP источника (параметр -s).
Просмотр статистики iptables
Запускаем iptables с параметрами -L и -v для просмотра статистики.
Опция -L определяет вывод статистики для цепочки (chain). Если конкретная цепочка не задана, то для всех.
Опция -v задает расширенный вывод, включающий в себя счетчики пакетов и байт.
Очень часто добавляется параметр -n, который говорит команде iptables о том, что не надо обращаться к DNS для разрешения IP адресов и вывода их в виде доменных имен. Это значительно уменьшает время на выдачу результатов и позволяет уменьшить нагрузку на сервер.
Для дополнительного удобства список правил может быть пронумерован. Для этого используется опция –line-numbers.
/sbin/iptables -L -v --line-numbers
Сохранение правил и статистики
Если перезагрузить компьютер или удалить iptables kernel modules вся информация о собранной статистике и добавленных правилах будет утеряна. Чтобы предотвратить потерю данных необходимо делать бэкап после каждого изменения в списке правил. Для этого служить утилита iptables-save. Например:
iptables-save -c > /root/iptables-backup.txt
Восстановить данные из бэкапа можно используя команду iptables-restore. Обычно это делается после перезагрузки в одном из скриптов инициализации, например в /etc/rc.d/rc.local для Red Hat Linux.
mysql -p
create database typo_user_typo CHARACTER SET utf8;
grant all on typo_user_typo.* to 'typo_user'@'localhost' \
identified by 'typo_password';
flush privileges;
use typo_user_typo;
source /home/typo_user/websites/www.mysite.com/db/schema.mysql.sql;