Эту заметку я хочу начать со смелого утверждения: каждый, кто хоть каким-то боком связан с разработкой веб-сайтов, должен знать хотя бы основы UNIX.
Автор:
Разместил: Amro   Дата: 2006-03-18 22:21
Комментарии: (0)   Рейтинг:

Так ли страшен черт, как его малюют, или UNIX для веб-мастера

Эту заметку я хочу начать со смелого утверждения: каждый, кто хоть каким-то боком связан с разработкой веб-сайтов, должен знать хотя бы основы UNIX. Не подумайте, что я фанатик, выступающий с кличем "Вынь - маст дай!" и призывающий всех установить "Линукс" в качестве рабочей системы, как раз наоборот: я твердо уверен, что ничего более удобного для пользователя, чем Windows, пока что не придумали.

Но дело в том, что всевозможные клоны UNIX - это операционные системы, созданные профессионалами и, что значительно более важно, для профессионалов. Но ведь и разработка сайтов - тоже занятие для профессионалов! А если добавить к этому тот факт, что на абсолютном большинстве серверов установлен именно UNIX, то без умения совершать в нем хотя бы базовые операции становится сложно... Не убедил? Давайте посмотрим примеры...

Захотелось вам, например, подправить скрипт у себя на сайте. Вы его подредактировали в Windows и по FTP выложили на сервер, правильно? Но пока вы его выкладывали, сервер выдавал ошибку вашим посетителям... А если вдруг свет выключили в тот момент, когда скрипт закачивался? Вероятность, конечно, мала, но я, например, один раз так "попал"... Или другой пример: хотите вы быстро посмотреть, сколько было заходов на какую-то страницу вашего сайта. Проще всего, разумеется, заглянуть в лог-файл "Апача". А как? Скачать его все по тому же FTP? А если этот лог несколько весит несколько десятков мегабайт (что не редкость)? Не проще ли зайти на сервер и посмотреть прямо там?.. Да и мало ли что еще может потребоваться: "Апач" перезапустить, загрузку сервера посмотреть, таблицу базы подредактировать...

Сразу оговорюсь: я не собираюсь писать учебник по Юниксу, а только хочу рассказать о самых основных действиях, которые приходится выполнять практически любому веб-мастеру.

Подключение к серверу обычно происходит через протокол telnet (что плохо, потому что ваши пароли и команды передаются в открытом виде и любой установленный в сети сниффер их перехватит), либо через SSH (Secure SHell). Для подключения вам потребуется терминальная программа - мне больше всех нравится PuTTY. Теперь, когда к серверу вы подключились и увидели приглашение командной строки, надо понять, что делать дальше...

Небольшое вступление

Пользователи Windows и DOS привыкли, что адрес файла выглядит как c:\dir1\dir2\filename.ext В Юниксе немножко по другому: /dir1/dir2/filename.ext. То есть понятие диска отсутствует, все адреса начинаются с корня - /. Обратите внимание, что используется прямой слэш, а не обратный - это очень распространенная ошибка. Путь к файлу может быть абсолютный (от корня, как показано выше) или относительный (так же, как и в ДОСе). Две точки, как и в ДОСе, означают вышестоящую директорию, одна точка - текущую.

В UNIX используется прямой слэш, а не обратный

Самая главная команда в UNIX'е - это man (сокращение от MANual). Юникс очень хорошо и подробно документирован, и если вы забыли параметры какой-то команды, то, набрав "man команда", вы получите подробную справку по этой команде. Одно из свойств UNIX'а - практически каждая команда понимает различные уточняющие параметры, и параметров этих могут быть сотни! Так что man вам очень пригодится... Нажатие любой клавиши позволяет перейти на следующий экран справки, работают стрелки для прокрутки вверх и вниз, а если где-то в середине справки вы нашли то, что искали, то до конца проматывать не обязательно - для выхода достаточно нажать "q" на клавиатуре. Большинство команд также понимают параметр --help (два минуса и слово help без пробелов) и выдают краткую справку о своем назначении и параметрах.

Читайте доки - они рулез!
Одна из проблем, часто вызывающих панику у пользователей - это выход из программ (типичный способ выхода из vi у начинающих пользователей - это reset на локальной машине или закрытие консоли на удаленной). Пугаться не стоит - в абсолютном большинстве программ вас спасет нажатие клавиши "q" или сочетанием Ctrl-C. А для завершения сеанса работы воспользуйтесь командами exit, logout или quit - разные системы могут использовать разные команды.

Данные, выдаваемые одной командой, можно подавать на вход другой - для этого используется вертикальная черта. Например, "cat myscript.pl | more" выводит скрипт с разбивкой на страницы. Можно выводимые данные и в файл записать с помощью > (перезаписать файл) или >> (дописать в конец файла).

Еще надо учитывать, что большие и маленькие буквы в UNIX'e различаются. file.txt и File.txt - это два разных файла, которые вполне могут лежать в одной директории.

Файловые операции

Посмотреть, где вы находитесь, можно с помощью команды pwd. Перейти в нужную директорию - cd. Удалить файл или директорию - rm или rmdir соответственно. Скопировать - cp. Переместить или переименовать - mv, создать директорию - mkdir. Назначение и использование этих команд, думаю, подробных пояснений не требует...

Reset - не единственный способ выйти из программы
Для того чтобы посмотреть список файлов в директории, используется ls. Понимает эта команда кучу параметров (смотрите документацию), из которых весьма полезным, на мой взгляд, является -l, который выводит детальный листинг. Листинг выглядит примерно следующим образом:

drwxr-xr-x 2 DimDim None 0 Apr 14 21:00 bin 
-rwxr-xr-x 1 DimDim None 57 Apr 14 21:01 cygwin.bat 
-rw-r--r-- 1 DimDim None 766 Apr 16 09:08 cygwin.ico 
drwxr-xr-x 9 DimDim None 0 Apr 14 20:22 etc 
drwxr-xr-x 3 DimDim None 0 Apr 14 21:55 home 
drwxr-xr-x 9 DimDim None 0 Apr 14 21:00 lib 
drwxr-xr-x 2 DimDim None 0 Apr 14 21:00 tmp 
drwxr-xr-x 16 DimDim None 0 Apr 14 21:00 usr 
drwxr-xr-x 7 DimDim None 0 Apr 14 20:25 var 
lrwxrwxrwx 1 DimDim None 120 Apr 16 08:08 www -> /usr/www

В первой колонке указан тип файла (первый прочерк говорит, что это обычный файл, d - директория, l - ссылка) и права доступа (r - читать, w - писать, x - выполнять; первые три символа - для владельца файла, вторые - для его группы, третьи - для всех остальных). Также можно увидеть владельца файла, его (файла) размер (цифры перед датой), дату модификации и имя. Имя со стрелкой говорит, что это ссылка, и показывает, куда она ведет.

ls - список файлов в директории
Ссылки - это примерно то же самое, что и ярлыки в Windows. Использовать их удобно во многих случаях - например, если вы храните скрипты в своей домашней директории и хотите быстро дать к ним доступ серверу, то достаточно создать ссылку на домашнюю директорию и поместить ее среди ваших веб-файлов - она сразу станет видна в браузере. Другое использование - если вы даете пользователям скачивать файлы и хотите, чтобы один и тот же файл был доступен под разными именами - например, myprog_ver_3.4.zip и myprog.zip. Можно, конечно, просто скопировать файл, но зачем тратить лишнее место на диске?.. Для создания ссылок используется команда ln (от слова link). Например, для рассмотренного выше случая с файлом надо написать "ln -s myprog_ver_3.4.zip myprog.zip". Параметр -s говорит, что мы создаем символьную ссылку (такую же, как ярлык в Windows). Есть еще "жесткая" ссылка - это примерно то же самое, как если бы мы присвоили файлу еще одно имя, причем эти имена стали бы совершенно равноправными. Делать ссылки на директории тоже можно - и этим удобно пользоваться, чтобы давать короткие имена или "объединять" директории, находящиеся в разных местах.

Ссылки удобны и экономят место
Иногда бывает необходимо найти нужный файл. Для этого используется команда find, у которой есть очень много параметров, позволяющих проводить поиск по самым разным критериям. Например "find /usr -name test*" найдет все файлы в директории /usr и ее поддиректориях, имя которых начинается на test.

Права доступа

find - ищет файлы на диске
Одна из проблем, с которой регулярно сталкиваются веб-мастера - это права доступа к файлам. Наиболее частыми ошибками является попытка сохранять данные в директории, в которой у вас (точнее у веб-сервера) нет прав на запись, а также отсутствие права на выполнение скриптов.

Есть три вида разрешений - чтение, запись и выполнение, которые присваиваются каждому файлу или директории. Разрешения эти повторяются три раза: для владельца файла, для группы пользователей, к которой владелец принадлежит, и для всех остальных пользователей. Сложности заключаются в том, что, как правило, веб-сервер запускается не от вашего имени, а от, например, nobody. И если вы свой файл читаете без проблем, то серверу система чтение запретит, если только вы явно не укажете, что оно разрешено. Право на выполнение для директорий дает доступ к содержимому этих директорий. Различные комбинации прав для файлов и директорий дают разные интересные эффекты. Например, право на чтение и запись файла не дает автоматически права на его удаление или переименование - это определяется правами директории. Комбинация прав на выполнение и чтение для директории позволяет получать список файлов этой директории, а права на запись и выполнение позволяют удалять файлы.

Ограничением UNIX является невозможность определить права для конкретного пользователя (кроме владельца), так что вы не сможете, например, разрешить выполнение скрипта только веб-серверу. Впрочем, это редко вызывает какие-то проблемы у веб-мастеров.

Для установки прав доступа используется команда chmod (CHange MODe). Права удобнее указывать в числовом формате: 4 - это право на чтение, 2 - на запись, 1 - на выполнение. Сумма этих чисел дает окончательный набор прав, например 6 - это чтение и запись, но без выполнения, 7 - все права, 5 - чтение и выполнение... Таким образом, для скриптов, например, удобно указывать "chmod 755 myscript.cgi" - вы оставляете себе все права, а всем остальным разрешаете скрипт читать и выполнять (вы же не хотите, чтобы веб-сервер мог ваш скрипт изменить?). Для обычных файлов можно указывать 644 - вы сами можете файл модифицировать, а остальные - только читать.

Работа с текстами

Неправильно настроенные права доступа - одна из самых распространенных ошибок! Вывод содержимого файла на экран выполняет команда cat. Также полезными являются head, которая выводит начало файла, и tail, которая выводит его конец. Head и tail понимают полезный параметр -n, указывающий, сколько строк вам надо вывести. Например "head -n 30 myfile.txt" выведет на экран первые 30 строк вашего файла. У команды tail есть еще один очень полезный параметр: -f, который выводит строки по мере их записи в файл. С помощью "tail -f errorlog", например, очень удобно в реальном времени отслеживать появление ошибок, да и вообще смотреть логи при тестировании чего-либо.

Одна из самых используемых в UNIX'e команд - это grep. Она позволяет выбрать только те строки, которые вас интересуют. Использовать ее очень удобно для обработки данных, выводимых другими командами - например, если вы хотите посмотреть все сообщения об открытии какой-то страницы в логе сервера, то можно просто написать "cat /var/log/httpd/access.log | grep mypage" (помните, что вертикальная черта передает выход одной команды на вход другой?). А если таких строк оказывается слишком много, то можно выход grep'а в свою очередь подать, например, на вход tail'а... У grep'а есть огромное количество параметров, разным способом влияющих на его поведение - очень советую почитать и поэкспериментировать, можно обнаружить много полезного. Кроме того, есть вариант этой команды egrep, который в запросах поиска понимает регулярные выражения, что тоже бывает очень удобно.

Просмотр логов - дело нужное!
Одним из самых распространенных текстовых редакторов в Юниксе является vi. В то же самое время, он является одним из наиболее сложных в освоении для пользователей Windows. На самом деле, сложного в нем ничего нет - надо просто понять, что у него два режима - командный и ввода текста. При старте vi запускается в командном режиме.

Использовать vi удобно в тех случаях, когда вам требуется немного подправить какой-то скрипт, страницу или файл конфигурации, лежащий на сервере. Это действительно проще, чем копировать файл к себе, редактировать, а потом снова выкладывать по FTP. Немножко потренируйтесь, и сами в этом убедитесь!

Например, вы заметили, что в файле написали "карова" вместо "корова". Запускаете vi: "vi myfile.htm". Теперь надо перейти к нужному месту (чтобы не листать всю страницу) "/карова" и нажать "ввод". Как только вы нажмете "слэш", курсор перепрыгнет вниз и будет ждать ввода строки для поиска. После того как вы ее введете и нажмете "ввод", редактор найдет первое вхождение этого слова и передвинет курсор туда. В принципе, никто не мешает вам просто прокручивать текст стрелками на клавиатуре, нажимая Ctrl-F (перемещение на страницу вперед) или Ctrl-B (на страницу вверх). Если вам потребуется найти не первое, а второе встречаемое в тексте слово "карова", то повторно текст можно и не вводить - достаточно нажать косую черту и enter. А если вместо косой черты использовать знак вопроса, то поиск будет идти не сверху вниз, а снизу вверх.

Теперь мы подводим курсор к букве "а", которую хотим заменить, и нажимаем "x" (икс) - эта команда удаляет символ справа от курсора. Можно также использовать "X" (большой икс), тогда удалится символ слева от курсора. Полезными являются также команды "dd" (удаление строки) и "D" (удаление от курсора до конца строки). Все это время мы оставались в командном режиме vi - то есть все символы, которые мы нажимали на клавиатуре, редактор считал командами, которые надо выполнить, а не текстом, который надо вставить в файл. Теперь пришла пора переключиться в режим редактирования.

Нажимаем "i" (начать ввод текста перед текущей позицией курсора). В принципе, могут пригодиться и другие команды, в зависимости от того, как написан ваш файл: "a" - начать ввод после курсора, "A" - ввод в конце текущей строки, "I" - ввод в начале текущей строки, "o" - новая строка ниже текущей, "O" - новая строка выше текущей. Но мы уже нажали "i" и теперь нам надо напечатать "о", вместо той "а", которую мы успешно удалили. Просто нажимаем на клавиатуре нужную букву и видим, как она вставилась в текст. Обратите внимание, что редактор все еще находится в режиме ввода текста, то есть можно продолжать печатать. Для того чтобы снова переключиться в командный режим, нажимаем кнопку "Esc" на клавиатуре. Сложность в том, что внешне командный и "редакторский" режимы не различаются. Поэтому, если вы запутались, то просто нажмите ескейп - если вы уже были в командном режиме, то редактор даст звуковой сигнал, а если были в режиме редактирования, то перейдете в командный, после чего никто не мешает снова нажать "i" и продолжать вводить текст.

Теперь отредактированный файл надо сохранить. Нажимаем ":" (двоеточие) и видим, как курсор перепрыгнул вниз, ожидая вашей команды. Нажимаем "w" и ввод. Все, файл сохранен! Но вы все еще в редакторе... Для выхода еще раз нажимаем двоеточие и "q". В принципе, можно было после первого двоеточия набрать "wq", тогда редактор бы сохранил файл и сразу закрылся (так обычно и делают). Здесь может возникнуть еще одна сложность - если вы отредактировали файл, а потом передумали его менять, то при попытке выйти из редактора он вам скажет, что, дескать, файл не сохранен, и откажется вас отпускать. Для того чтобы настоять на своем, можно после команды поставить восклицательный знак, тогда редактор поймет, что вы настроены серьезно, и не станет с вами спорить.

При использовании vi редактирование ведется не над самим файлом, а над его копией. И только когда все работы закончены, исходный файл замещается отредактированным. Это позволяет править даже большие скрипты, расположенные на работающем сервере, не опасаясь того, что во время редактирования пользователи будут получать сообщения об ошибке.

Работа с программами

vi уже отредактировали свои тексты?
Для запуска программы надо просто набрать ее имя, нужные параметры и нажать ввод. Сложность в том, что, пока такая программа работает, вы ничего делать не можете - надо ждать ее завершения. А если программа работает долго? Или вообще это сервер, который должен висеть и ждать запросов? Тоже не беда! Для того чтобы запустить программу в фоновом режиме, надо после нее поставить "&". Посмотреть список фоновых программ, которые вы запустили, можно командой "jobs". В полученном списке все команды будут пронумерованны, и если какую-то из них вы захотите "вытащить на поверхность", то можно сказать, например, "fg 1". Для того чтобы перевести в фон запущенную программу можно использовать "bg". Названия fg и bg - это от слов foreground и background, так что запоминаются легко. Но если программа уже работает, то команду "bg" ввести не получится, так что сначала надо будет сказать Ctrl-Z (после чего программа приостановится), а потом уже воспользоваться jobs и bg.

Однако у фоновых программ есть свои сложности - если вы выйдете из системы, то программа будет "убита". А в фоне часто запускаются такие программы, которые считают что-то довольно долго... Так что же - сидеть и ждать? Нет. Тут пригодится nohup, которая не даст убить программу при вашем отключении. То есть, написав "nohup myverylongprogram &", вы можете спокойно отключаться, а заглянув на сервер через часок-другой, посмотреть результаты работы программы.

Для того чтобы посмотреть, какие программы сейчас запущены, используется команда "ps". У нее довольно много параметров, указывающих, какими именно процессами вы интересуетесь, и в каком формате надо показывать результаты. Полезными параметрами являются "a" (показывать не только ваши процессы, но и других пользователей), "l" (выводит более подробную информацию о каждом процессе) и "w" (не обрезает строку на 80-м символе). Так как на сервере обычно выполняется очень много программ, то для отбора нужных записей удобно бывает перенаправить вывод в grep.

У каждого процесса есть PID - Process ID. Если вы решите какую-то задачу убить, то вам понадобится команда kill. В качестве параметра к ней указывается PID того процесса, к которому вы хотите kill применить. На самом деле, kill не убивает процесс, а передает ему какой-то сигнал, на который процессы реагируют. В частности, можно, например, заставить сервер перечитать файл конфигурации. Более подробно - в справке.

Учтите, что многие серверные программы не любят, когда им напрямую посылают команды, а содержат в своей поставке специальные управляющие утилиты. Например, для Apache это apachectl, для PostgreSQL - pg_ctl и т.д.

Чем занят сервер

Команда ps выводит список процессов, запущенных в данный момент времени. Причем список этот длинный, и для того чтобы дать понять, насколько загружен сервер, мало приспособлен. В отличие от него, команда top выводит и обновляет в реальном времени список запущенных процессов, причем сортирует их по степени использования процессорных ресурсов. То есть вы сразу можете увидеть, какая из программ является наиболее ресурсоемкой, и как себя чувствует сервер в целом - в верхней строке top выводит справочную информацию о состоянии сервера: загрузку памяти, файла подкачки и процессора, разбивку загрузки между системными и пользовательскими программами, количество выполняющихся процессов...

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

Часто оказываются полезными команды df и du. Первая позволяет посмотреть, сколько места занято и свободно на дисках, а вторая показывает размер директорий вместе с поддиректориями (параметр -d указывает глубину вложенности, которую надо смотреть). Обе эти (и некоторые другие) утилиты лучше запускать с параметром -h - тогда они будут показывать размер в кило- мега- и т.п. байтах, а не в блоках. Например "du -h -d2 /usr".

Заключение

Вот, пожалуй, и все. Разумеется, я прекрасно понимаю, что этой статьи абсолютно недостаточно для более-менее полного знакомства с UNIX, но я ведь и не ставил перед собой такой задачи. Для этого существуют сотни очень толстых книжек... Я же всего лишь, как и обещал в начале статьи, постарался рассказать о самых базовых вещах, которые могут понадобиться любому веб-мастеру. Надеюсь, что это окажется кому-то полезным.