Журнал LinuxFormat - перейти на главную

LXF147:tut3

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Тренинги Linux

Часть 7: Учитесь управлять процессами как профи и овладейте редактором Vi, который славен своим минимализмом.
Наш эксперт

Майк Сондерс пишет о Linux более десяти лет, и установил больше дистрибутивов, чем съел горячих обедов.

Рад видеть тебя, видеть тебя, nice

По умолчанию права доступа к ресурсам у всех процессов одинаковы. Если процессы A и B оба потребуют время процессора, планировщик ядра Linux разделит это время между ними поровну. А это не всегда желательно, особенно если много процессов выполняется в фоновом режиме. Например, может по расписанию включиться задание cron на сжатие старых архивных файлов на домашнем компьютере – если пользователь делает нечто срочное, вы вряд ли захотите, чтобы из-за этого он внезапно лишился 50 % вычислительной мощности.

Борется с такими ситуациями система приоритетов. У каждого процесса есть значение nice [англ. любезность], определяющее его послушание операционной системе. Наибольшее значение nice равно 19; по умолчанию оно равняется нулю и может доходить до -20 (наибольший приоритет). Например, для запуска программы с наименьшим приоритетом воспользуйтесь командой

nice -n 19 programname

Программа запустится и, если в системе больше ничего не происходит, завершится в отведенный срок. Но при наличии других процессов система сначала отработает с теми. Для задания значений nice ниже нуля вы должны иметь права root:

sudo nice -n -10 programname

Это касается многопользовательских систем, где администратор отдает приоритет своим задачам (иначе все остальные назадавали бы максимальные приоритеты своим процессам!). Значение nice процесса можно изменить командой renice – более подробную информацию см. на ее странице справки – а значения nice выводит команда top.

Наша серия про LPI близится к концу – последняя статья выйдет в следующем месяце; и пора обратиться к сложностям, встречающимся на пути системного администратора.

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

Наконец, мы исследуем редактор Vi, поставляемый почти с каждым дистрибутивом Linux и Unix; он считается трудным в освоении, но для разобравшихся в его основах становится просто даром Божьим.

В следующем номере мы приведем подробный список учебных вопросов для LPI, поэтому, когда вы закончите с этим руководством, у вас будет несколько недель, чтобы освежить знания. Удачи!

Скорая помощь

Комбинации клавиш для остановки и приостановки процессов, такие как Ctrl+C и Ctrl+Z, работают в большинстве случаев, но не всегда.

Обработку этих клавиш можно переназначить программно, задав им другой функционал или сделав так, чтобы сотрудники не забрасывали важные программы ради игры в Nethack!

Раздел 1: Управление процессами

Представьте, что вы, сидя дома, размечтались о чашечке чая. Как человек предприимчивый, вы просите ближайшего члена семьи ее вам приготовить. Вышеупомянутый член рысит на кухню; но, обернувшись в кресле, вы видите, что он/она вместо чая заваривает кофе. Вы восклицаете «Черт побери, я же просил чаю!» или нечто подобное. А как это звучит в терминах компьютера? Что происходит, если вы запустили программу и хотите остановить ее или изменить способ ее работы?

На простейшем уровне, выкрику «стоять!» соответствует нажатие Ctrl+C. Попробуйте эту комбинацию клавиш с командой, генерирующей большой объем вывода, вроде ls -R / для вывода содержимого корневого каталога и всех его подкаталогов. Когда она примется изрыгать тысячи строк на терминал, можно нажать Ctrl+C и остановить ее на полпути. Команда остановлена; больше ничего не делается. Это крайне важно на случай, если сдуру введено что-то неправильное и надо срочно пресечь команду, пока она не нанесла ущерб.

Однако бывают и другие варианты. Что если вы просто хотите отложить выполнение программы на потом? Например, вы ввели команду man gcc (чтобы прочесть страницу справки по компилятору GNU C Compiler), прокрутили текст вниз и увидели что-то интересное – вам хочется это опробовать, не теряя положения в тексте. Нажмите Ctrl+Z, и страница просмотра справки исчезнет в фоне, оставив вас в командной строке. Сделайте то, что хотели, и наберите fg (от foreground – передний план) – вы вернетесь в то же место страницы справки, где и были.

Скорая помощь

Краткий обзор производительности вашей системы можно получить по команде uptime. Она показывает, сколько времени истекло с момента последней (пере)загрузки, сколько пользователей в системе, и среднюю нагрузку за последние периоды времени.

Программу можно запустить в невидимом режиме (приостановив), чтобы вы могли вернуться к ней, когда созреете. Для этого добавьте к имени команды символ амперсанда (&) следующим образом:

man df &

Здесь мы открываем для просмотра страницу справки для команды df (она отображает объем свободного места на диске), но делаем это в фоновом режиме. Экран отреагирует строкой

[1] 3192

В скобках показан порядковый номер фоновой программы; второе число – идентификатор процесса (мы перейдем к ним через минуту). Теперь занимайтесь делом, а когда нужно будет пристроиться к запущенной программе, просто введите fg.

Эта система становится особенно удобной при манипуляции несколькими программами. Например, введите

nano &
man df &
Проверка целостности файловой системы

Современные файловые системы Linux, такие как ext4 (система по умолчанию в большинстве современных дистрибутивов), безотказны и надежны. Они не сотворят чудес при сбое электросети, но могут попытаться оставить файловую систему в относительном порядке, чтобы вы не потеряли все данные. Однако все на свете уязвимо, и если у вас проблема с «железом», можно заподозрить, что сломался жесткий диск. Как решил бы вопрос администратор?

Во-первых, наберите dmesg и посмотрите, нет ли чего веселенького в файлах журналов: сообщений об испорченных данных или секторах и т. д. Если вы узрели нечто подобное, сразу же вставьте в компьютер съемный USB-диск и скопируйте все важные данные, потому что нельзя знать заранее, когда диск окончательно рухнет. Затем по команде df -h определите объем свободного места на диске; если он гораздо меньше, чем вы ожидали, что-то явно не так. Для просмотра дискового пространства в каталогах пользуйтесь du -h.

Следующий шаг – проверка файловой системы. Перезагрузите свою систему в однопользовательский режим (способ этой перезагрузки зависит от дистрибутива, но обычно включает изменение строки конфигурации ядра в загрузчике и добавление в конец S.) Войдя в терминал, введите:

/sbin/fsck device-name

Измените device-name на файл устройства основного корневого раздела, например, /dev/sda1. Так же можно проверить и другие разделы. fsck, по сути, внешняя оболочка для утилит проверки разных файловых систем и в большинстве компьютеров с Linux запускает /sbin/e2fsck, которая работает с файловыми системами ext2/3/4. Если проверка обнаружит проблемы, fsck спросит вас, что нужно сделать. После проверки можно запустить /sbin/dumpe2fs с именем устройства и получить более подробную информацию о разделе – она пригодится для сообщения о проблеме на интернет-форуме.

Вы можете заметить, что во многих дистрибутивах Linux проверки файловой системы с fsck автоматически запускаются после каждых 30 загрузок, или каждых 100 дней, или и того, и другого. Изменяет этот механизм утилита tune2fs с опциями -c и -C. Она также может задать действия ядра при обнаружении ошибок и много чего еще. Имеет смысл прочесть ее страницу справки, особенно информацию о первых пяти опциях. Похожая, хотя и глубоко техническая утилита – debugfs, но чтобы пользоваться ею продуктивно, нужно отлично знать внутреннее устройство файловой системы.

Здесь мы запустили две программы в фоновом режиме. Если ввести jobs, мы получим их список с номерами и командами их запуска. Можно восстановить выполнение программы по ее номеру: например, fg 1 переключит нас в редактор Nano, а fg 2 — в программу просмотра страницы справки.

Теперь – к процессам. По сути, процесс – это экземпляр выполняемой программы. Большинство простых программ создают единственный процесс: самое себя. Более сложные программы, такие как рабочий стол, запускают множество процессов – демоны мониторинга файлов, оконные менеджеры и т. д. Это помогает обслуживать систему (представьте, что весь KDE был бы в одном огромном исполняемом файле, и при выходе из строя одного компонента рухнуло бы все), а также позволяет делать всякие удобные вещи.

Чтобы вывести список процессов, наберите ps. Вывод команды вряд ли вас вдохновит – скорее всего это будет лишь пара строк: команда выведет только процессы, запущенные текущим пользователем. Для просмотра всех процессов, выполняющихся на компьютере, введите ps ax. Обычно их список очень длинен, и лучше переправить его через канал команде less, как мы рассказывали в прошлом месяце:

ps ax | less

Что именно вы увидите, зависит от конкретной сборки дистрибутива Linux и запущенных в данный момент программ, но вот вам пример:

2972 pts/0 Ss 0:00 bash

Здесь 2972 – идентификатор процесса (PID). У каждого процесса есть уникальный идентификатор, начиная с номера 1, соответствующего программе /sbin/init, которую ядро запускает при загрузке. Следующий фрагмент pts/0 показывает, с какого виртуального терминала была запущена команда – если здесь вы видите знак вопроса, то процесс был запущен вне терминала: например, ядром или скриптом загрузки. Ss означает, что процесс спит (не производит активной работы), затем идет индикатор времени, показывающий, сколько процессорного времени процесс получил на данный момент, а за ним следует команда, запустившая процесс.

Еще один способ получения списка процессов (по умолчанию отсортированного по потреблению процессора) – команда top. Это интерактивная программа – она обновляется каждые несколько секунд, отображая в верхней части списка задачи, наиболее активно использующие процессор. Столбцы снабжены заголовками (в черном прямоугольнике), и вы можете определить идентификатор процесса, пользователя, который его запустил, и т. д. Обратите внимание на различные столбцы с информацией об использовании памяти: самый важный из них – RES (resident – резидентная часть), в нем показан объем реальной памяти, который процесс использует в данный момент. Для выхода из top нажмите Q.

Итак, предположим, что вы удачно запустили программу, но внезапно она дала сбой: застряла в цикле и съедает все процессорное время. Завершить ее, нажав Ctrl+C, нельзя – вы запускали программу не из терминала, а из оконного менеджера. Что делать? Первая возможность – определить идентификатор с помощью описанных выше методов и ввести команду

kill <pid>

Замените <pid> идентификатором процесса. Хотя эта команда и намекает на убийство, но по умолчанию ведет себя довольно мягко. От себя лично kill отправляет процессу дружелюбное сообщение «Не хотите ли завершиться?», получив которое, процесс может предпринять необходимые действия (например, удалить временные файлы перед завершением). Иногда это остановит процесс, но если у процесса есть собственный обработчик сигнала kill и по причине сбоя он уже ни на что не способен – вы в тупике. Тут kill начинает оправдывать свое название. Введите

kill -9 <pid>

Команда даже не вникает, что там творится с программой – она просто останавливает ее немедля. Если процесс в этот момент записывал данные в файл, результаты могут оказаться весьма беспорядочными, поэтому данный способ следует применять весьма осторожно и только тогда, когда исчерпаны другие возможности.

Иногда бывает несколько процессов с одним и тем же именем, или вам просто лень искать PID процесса. В этом случае пригодится команда killall. Например, пусть вы скомпилировали новейший модуль Apache, добавили его в Apache... и ваш web-сервер пошел наперекосяк, но не дает себя остановить обычными скриптами, причем запущено множество экземпляров apache. Попробуйте такую команду:

killall -9 apache

Другой полезный сигнал, который не является разрушительным, а лишь велит программе перезапуститься или перечитать свои файлы настройки – SIGHUP, названный по выражению “hanging up» [вешать трубку, разъединяться] из эпохи телефонных модемов. Многие программы игнорируют этот сигнал, но он прекрасно работает с рядом фоновых демонов, таких как серверы:

killall -HUP sendmail

Эта команда велит всем выполняющимся процессам sendmail на секунду приостановиться, перечитать файлы настройки и продолжать работу. Это очень удобно, когда вы хотите быстро изменить файл настройки, не останавливая всю программу. Если по какой-то причине вы не хотите, чтобы этот сигнал обрабатывался, воспользуйтесь nohup для его отключения – более подробную информацию см. в man nohup.

Проверьте себя!

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

  1. Как запустить команду exim -q в фоновом режиме?
  2. Есть несколько программ, запущенных в фоновом режиме. Как вывести их список?
  3. Как получить список процессов?
  4. Exim стал чудить, и вам нужно полностью завершить все запущенные экземпляры программы. Какой командой это делается?
  5. Вы только что создали новый раздел /dev/sda2 и хотите отформатировать его в FAT32. Как?
  6. Напишите команду для запуска myprog с самым низким приоритетом.

ответы

Раздел 2: Создание новых файловых систем

Перейдем к сложной теме, которой вам как системному администратору обычно касаться не придется – файловым системам и разбиению на разделы. По крайней мере, такое случается не каждый день. В большинстве случаев настройки разделов задаются при установке и сохраняются месяцами или даже годами. Графические утилиты вроде GParted, используемые во многих установщиках, значительно упрощают этот процесс, но на случай внештатных ситуаций важно иметь представление об утилитах командной строки.

Для начала припомним: жесткий диск обычно делится на несколько разделов. Например, у вас может быть раздел с Windows и раздел с Linux. Большинство систем Linux располагаются на двух или более разделах: разделах данных (таких как / и /home) и разделе подкачки для виртуальной памяти. Данные на этих разделах должны храниться в определенном порядке, или формате, и исторически в Linux это был формат файловой системы ext2. Потом появилась ext3 (то же, что и ext2, но с добавлением журналирования), а теперь – ext4. Другие типы разделов из мира Linux и UNIX включают XFS и ReiserFS. В большинстве систем Windows используется NTFS, но на внешних носителях, таких как USB-брелки, обычно используется FAT32 (также известная в Linux как VFAT).

Основная утилита разбиения диска на разделы с командной строки – fdisk. В качестве ее аргумента нужно указать файл устройства для вашего жесткого диска следующим образом:

/sbin/fdisk /dev/sda

(Учтите, что запускается эта команда от имени root; а если вы не уверены в том, какой файл устройства соответствует жесткому диску, загляните в вывод dmesg.) Также обратите внимание, что здесь указано /dev/sda, а не /dev/sda1: последняя цифра – номер конкретного раздела, а нам необходим весь диск. В большинстве случаев sda – первый жесткий диск, sdb – второй, и т. д.

fdisk – довольно «голая» программа, без меню или мастеров для автоматизации действий. Введите p для вывода списка разделов своего жесткого диска и m для вывода справки. Вы увидите команды для удаления разделов, создания новых разделов и т. д. Все производимые изменения не записываются на диск до тех пор, пока вы не нажмете w. В некоторых дистрибутивах есть cfdisk, версия fdisk на основе curses, где все немного удобнее: есть простые меню, а перемещаются по ним клавишами управления курсором.

Создав раздел, отформатируйте его. Тут в дело вступают утилиты mkfs. Наберите /sbin/mkfs и нажмите Tab для вывода возможных вариантов – вы увидите mkfs.ext3 (для большинства разделов Linux), mkfs.vfat (для разделов FAT32) и другие. Для форматирования раздела просто укажите его файл устройства:

/sbin/mkfs.ext3 /dev/sda2

Для разделов подкачки пользуйтесь командой mkswap. Затем можно активировать и деактивировать раздел подкачки командами swapon и swapoff.

Скорая помощь

Чтобы узнать объем доступной памяти, введите free -m. Команда отображает статистику в мегабайтах. Первая строка может шокировать вас и заставить подумать, что памяти почти не осталось, хотя у вас работает один Fluxbox. Но данная цифра включает кэш на дисках, поэтому смотрите на вторую строку: -/+buffers/cache.

Раздел 3: Краткий обзор редактора Vi

Наконец, в этом месяце мы бегло оглядим Vi, «визуальный» редактор. А не нелепо ли описывать редактор как «визуальный» – разве не все они такие? Но в семидесятые годы, когда Vi разрабатывался для операционных систем Unix, кое-кто еще пользовался телетайпами...

Идея полноэкранного редактора была достаточно новаторской, так как люди привыкли работать с отдельными строками текстового файла. Редактор Vi – очень сжатый и примитивный, но благодаря его низким требованиям устанавливается почти на каждый компьютер с Unix. В мире Linux большинство дистрибутивов содержат Vim (Vi Improved), гораздо более продвинутую версию редактора.

Начинаем

Для запуска редактора наберите vi filename.txt. Прежде чем колотить по клавишам, обратите внимание, что Vi работает в двух режимах: обычном (для команд) и вставки (для редактирования текста). Это отличает его от большинства других редакторов, в которых сразу набирается текст.

В Vi для ввода текста в текущей позиции курсора нужно нажать i, после чего вы сможете набрать то, что хотите. Закончив, нажмите Esc для возврата в обычный режим ввода команд.

Команд в Vi немало, и если вы хотите стать гуру Vi, то специальных книг про него хватает. Но вот самые основы: в обычном режиме ввод dd удаляет строку, yy копирует строку в буфер обмена, а p вставляет эту строку обратно в текст.

Для выполнения некоторых операций сначала нужно набрать двоеточие. Например, :w записывает файл на диск, а :q завершает работу редактора. (Если вы что-то переделали, не сохранили изменения и попытались выйти, Vi может пожаловаться – выйти без сохранения данных можно командой :q!.) Действия можно объединять: например, команда сохранения и выхода – :wq.

Многие люди считают Vi и Vim дико неудобными в работе и предпочитают редакторы без командного режима, типа Emacs или Nano. Другие, наоборот, обожают первые два из вышеупомянутых за минимализм и ненавидят склонность двух последних неумеренно злоупотреблять клавишей Ctrl. Эта война пылает постоянно, но, независимо от ее исхода, все хорошие администраторы должны иметь базовые навыки работы в Vi, так как он почти наверняка будет на любом компьютере, который вам попадется.

Персональные инструменты
купить
подписаться
Яндекс.Метрика