Вирусы на Linux в нашей компании достаточно редкое явление, но иногда приходят клиенты с медленно работающими сайтами, и в процессе обнаружения узких мест обнаруживается, что сервер себя странно ведет. Сегодня расскажу об одном таком случае.
К нам обратился клиент с медленно работающим сайтом, я подключился по ssh и стал смотреть на что же тратятся ресурсы сервера. Запустил top и увидел следующую картину:
1125 wwwuser 20 0 4708 2472 1032 R 32 0.1 8133:04 perl 1213 wwwuser 20 0 4708 2548 1100 R 32 0.1 18558:18 perl 3912 wwwuser 20 0 4708 2532 1100 R 32 0.1 17291:47 perl 21038 wwwuser 20 0 4708 2384 956 R 29 0.1 3323:27 perl 1541 wwwuser 20 0 4712 2384 956 R 28 0.1 10712:59 perl 21029 wwwuser 20 0 4708 2544 1092 R 28 0.1 5689:23 perl 22862 wwwuser 20 0 4712 2548 1092 R 28 0.1 6588:16 perl 1196 wwwuser 20 0 4708 2548 1100 R 28 0.1 6191:47 perl 1546 wwwuser 20 0 4712 2384 956 R 27 0.1 16920:10 perl 1186 wwwuser 20 0 4708 2540 1100 R 27 0.1 16774:50 perl 3903 wwwuser 20 0 4708 2476 1036 R 27 0.1 18234:33 perl 9886 wwwuser 20 0 4712 2480 1032 R 27 0.1 1751:53 perl
То есть процессор нагружали только процессы perl - и это при том что сервер работает на связке nginx + apache, которые обслуживают Drupal сайт (соответсвенно на php).
Решил посмотреть на вывод
ps aux | grep perl
Не тут-то было, процессов perl вообще не было.
Далее посмотреть вывод команды ps aux
wwwuser 18979 0.0 0.0 4844 228 ? S Apr14 0:00 /usr/local/apache/bin/httpd -DSSL wwwuser 18983 0.0 0.3 4844 1928 ? S Apr14 10:28 /usr/local/apache/bin/httpd -DSSL wwwuser 18990 0.0 0.0 4844 228 ? S Apr14 0:00 /usr/local/apache/bin/httpd -DSSL wwwuser 18994 0.0 0.1 4844 748 ? S Apr14 1:55 /usr/local/apache/bin/httpd -DSSL wwwuser 18997 0.0 0.0 4844 228 ? S Apr14 0:00 /usr/local/apache/bin/httpd -DSSL wwwuser 19001 0.0 0.3 4844 1804 ? S Apr14 10:28 /usr/local/apache/bin/httpd -DSSL wwwuser 19224 0.0 0.0 4844 228 ? S Apr14 0:00 /usr/local/apache/bin/httpd -DSSL wwwuser 19228 0.0 0.3 4844 1824 ? S Apr14 10:26 /usr/local/apache/bin/httpd -DSSL wwwuser 20667 0.0 0.0 4844 228 ? S Apr14 0:00 /usr/local/apache/bin/httpd -DSSL wwwuser 20671 0.0 0.3 4844 1804 ? S Apr14 10:16 /usr/local/apache/bin/httpd -DSSL
Помимо большинства нормальных процессов в выводе присутсвует много процессов, запущенных командой: /usr/local/apache/bin/httpd
При этом файла /usr/local/apache/bin/httpd не существовало.
Далее выполняем команду lsof -p 1125 (просмотр используемых файлов процессом 1125), и получаем следующий вывод:
perl 1125 wwwuser cwd DIR 8,5 36864 69410 /tmp perl 1125 wwwuser rtd DIR 8,5 4096 2 / perl 1125 wwwuser txt REG 8,5 1224372 88910 /usr/bin/perl perl 1125 wwwuser mem REG 8,5 17836 99536 /usr/lib/perl/5.10.1/auto/IO/IO.so perl 1125 wwwuser mem REG 8,5 1421892 203999 /lib/libc-2.12.1.so perl 1125 wwwuser mem REG 8,5 121578 204013 /lib/libpthread-2.12.1.so perl 1125 wwwuser mem REG 8,5 9736 204002 /lib/libdl-2.12.1.so perl 1125 wwwuser mem REG 8,5 21964 99538 /usr/lib/perl/5.10.1/auto/Socket/Socket.so perl 1125 wwwuser mem REG 8,5 118084 203996 /lib/ld-2.12.1.so perl 1125 wwwuser mem REG 8,5 149392 204003 /lib/libm-2.12.1.so perl 1125 wwwuser mem REG 8,5 38360 204001 /lib/libcrypt-2.12.1.so perl 1125 wwwuser 0r CHR 1,3 0t0 4299 /dev/null perl 1125 wwwuser 1w FIFO 0,8 0t0 1688813 pipe perl 1125 wwwuser 2w FIFO 0,8 0t0 1688813 pipe perl 1125 wwwuser 3w FIFO 0,8 0t0 1688813 pipe
Видим запуск /usb/bin/perl.
Дальше наши действия простые
rm /usr/bin/perl killall -9 perl
После этого проблема исчезла, но подозреваю, что это еще не все.
P.S. Если кто сталкивался с такой проблемой, напишите, пожалуйста ваше решение в комментариях.
UPD. Спасибо, Сергею, что указал на неполноту статьи. Конечно, просто так сервер оставить нельзя, потому что без /usr/bin/perl некоторые системные скрипты не смогут отрабатывать.
После удаления я сделал ссылку /usr/bin/perl на файл /usr/bin/perl5.10.1
ln -s /usr/bin/perl5.10.1 /usr/bin/perl
Теперь все скрипты perl будут корректно выполнятся.