Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программы

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

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

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

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

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

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

# nice -10 ccl

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

# 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'а как обычно можно все.


Главная > Программы