Переход к предыдущей публикации Устранение багов Simple Machines Forum Wget и cookies. Закачка в консоли с файлообменников. Переход к следущей публикации
 
Я хочу добавить Daemony`s Live RSS ленту в Google Reader Я хочу добавить Daemony`s Live RSS ленту в Яндекс.Лента Я хочу получать RSS ленту Daemony`s Live Blog по электронной почте Я хочу добавить Daemony`s Live RSS ленту в My Yahoo Я хочу добавить Daemony`s Live RSS ленту в My MSN

 

Добавить комментарий

Использование nice, renice, kill, killall для манипулирования процессами во FreeBSD

System Иногда, в процессе обслуживания системы, возникает необходимость манипулировать тем или иным процессом. Что это означает? Сейчас расскажу. Один мой товарищ (начинающий юниховод) недавно спросил: "Я тут комплилю нечто… Но что-то я больше ничего не могу делать, потому что машина слабая и все ресурсы забрал под себя процесс компиляции. Ему можно как то сказать, чтобы не наглел?". - Да, можно. Собственно, из этого вопроса мне и пришла в голову мысль написать все нижеизложенное.

Каждая программа в системе требует свою долю процессорного времени. Одной из задач ядра FreeBSD является разрешение конфликтов при обращении к центральному процессору. Если выполняется, например, две ресурсоемкие задачи, FreeBSD распределяет между ними время доступа к процессору пополам, дабы никого не обидеть. Но иногда нужно запустить какой-то процесс с низким или, наоборот, высоким приоритетом. В этом случае нам как раз пригодится команда nice. Родственная ей команда - renice - которая позволяет "на лету" изменить приоритет уже запущенного процесса.

Команда nice используется таким образом:

$ nice [-число] команда [аргументы]

где - команда и аргументы - это запускаемый процесс и передаваемые ему аргументы. Число - это, так называемый, фактор уступчивости. Чем он выше (максимум 20), тем ниже приоритет процесса (процесс поступается на 20 пунктов, например), и наоборот: чем он ниже (до -20 - "минус двадцать"), тем выше приоритет процесса. Сложно? :) Совсем нет. Главное запомнить то, что "число" указывает не на приоритет процесса, а на уровень занижения этого приоритета. И еще следует запомнить, что это число может быть как положительное так и отрицательное. При этом в командной строке перед ним указывается знак минус. Например: чтобы выставить процессу ccl уступчивость "плюс десять" следует написать так:

$ nice -10 ccl

Тем самым мы понижаем приоритет. Если же нужно наоборот, увеличить приоритет (уменьшить уступчивость), то нужно написать так:

root # nice --10 ccl

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

Если числовой аргумент не указан, то подразумевается всегда значение 10 (по-умолчанию).

Команда renice значительно увеличивает функциональность nice и может изменить приоритет уже запущенного процесса. Запускается команда в таком виде:

# renice уступчивость [[-p] PID] [[-g] группа] [[-u] пользователь]

Можно задать идентификатор процесса (process id) или группу пользователей, которая владеет процессом или имя пользователя владельца процесса. В данном случае уступчивость выражается как и в предыдущем примере числом от -20 до 20, но указывается без знака "минус". Следущим примером можно повысить приоритет всех процессов пользователя daemony:

# renice -1 daemony

И опять так, повышать приоритеты процессов может только пользователь root. Обычный пользователь, может выполнять renice только для собственных процессов. И если он понизит через renice приоритет своего процесса, повысить его обратно уже не сможет.

Посмотреть приоритет процесса можно запустив штатный "Диспетчер задач" FreeBSD - утилиту top.

PID USERNAME NICE  SIZE   RES   STATE   WCPU COMMAND
 834  mysql   14   45316K 17308K select  0.00% mysqld
 835  mysql   14   45316K 17308K select  0.00% mysqld

- Дружище, ты получил ответ на свой вопрос? ;)


В дополнение, раз уж заговорил об управлении процессами в системе, стоит упомянуть еще одну команду управления процессами - kill и killall. Этими программами можно пользоваться в случае "зависания" процессов, для их аварийного завершения, для передачи указания перечитать настройки и т.д. Несмотря на свое название, kill может не только "убивать". ;) Команда kill выполняется в таком виде:

kill [-l] [[-s] СИГНАЛ PID

где - СИГНАЛ - это… это собственно сигнал, который может быть задан по имени, либо в своем числовом представлении. Параметры -l и -s необязательные. Наберите kill -l и увидите, какие сигналы могут быть посланы процессу.

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGEMT       8] SIGFPE
 9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGURG
17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGINFO     30) SIGUSR1     31) SIGUSR2

Все запоминать не стоит. Достаточно несколько наиболее распространенных:

  • HUP или 1 - обычно посылает процессу указание перечитать настройки конфигурации;
  • INT или 2 - сигнал прерывания;
  • QUIT или 3 - выход, завершение;
  • ABRT или 6 - аварийное завершение;
  • KILL или 9 - безусловное завершение процесса, "убиение";
  • ALRM или 14 - сигнал от таймера;
  • TERM или 15 - наиболее правильное и наиболее корректное завершение процесса.

Сигнал TERM используется для нормального выхода программы с сохранением всех данных. Наоборот, сигнал KILL используется если программа не отвечает. Данные, которые процесс не успел записать на диск, при этом не сохраняются. Рекомендуется использовать как можно реже, но если такая необходимость появилась, то комбинация killall -KILL process всегда выручит.

Процесс, кстати, можно указать как по имени, так и по PID’у. При этом точное имя процесса можно узнать с помощью команды ps:

 # ps -ax | grep sshd
 39293  ??  Is     0:00,28 /usr/sbin/sshd
 40692  ??  Ss     0:00,28 sshd: root@ttyp0 (sshd)

Для того, чтобы послать сигнал всем процессам в системе соответсвующих определенному имени можно воспользоваться аналогом kill командой killall:

 # killall -HUP sshd

Этим примером, мы заставим все процессы ssh демона перечитать свой конфигурационный файл. А если Вы выполните эту команду:

 # killall -9 sshd

то мгновенно отключите ssh доступ к Вашей машине. ;) Обычные пользователи могут "килять" процессы, естественно, только свои. Для root’а как обычно можно все.

 

Ключевые слова


| | | | | | | |
 

Публикации по теме

Воскресенье, 17 февраля, 2008 16:09:34 EET

Подпишись на RSS ленту и будь в курсе обновлений

Я хочу добавить Daemony`s Live RSS ленту в Google Reader Я хочу добавить Daemony`s Live RSS ленту в Яндекс.Лента Я хочу получать RSS ленту Daemony`s Live Blog по электронной почте Я хочу добавить Daemony`s Live RSS ленту в My Yahoo Я хочу добавить Daemony`s Live RSS ленту в My MSN

Я хочу подписаться на Daemony`s Live RSS ленту комментариев к записям
  1. Комментарии (3) к публикации “Использование nice, renice, kill, killall для манипулирования процессами во FreeBSD”

  2. № 1 .:. аш говорит:

    усё понял, запомнил, записал, спасибо :)

    2008-07-05 08:50:59 EEST
  3. № 2 .:. Daemony говорит:

    аш, самое главное записывать. Не записывая можно что-либо да забыть. :)

    2008-07-05 11:54:37 EEST
  4. № 3 .:. denreg говорит:

    А как тогда прописать допустим в make.conf чтоб всегда приоритет процесса сборки ядра,мира или портов был всегда низким?

    2008-11-07 14:59:20 EET

Добавить комментарий

Быстрая вставка HTML тегов

Подсказки:
  • Для вставки фрагментов кода используйте "быстрый" тег <PRE></PRE>.
  • Для цитирования фрагментов текста используйте "Цитата".
  • Поддерживаются также другие HTML теги.

Поля, помеченные красной "звездочкой" обязательны к заполнению.