Управление процессами в linux
Содержание:
Procedure Results
Silas 2005-08-18: I think the best way to return multiple values is to use a list. For example:
proc v {} { set value1 somevalue set value2 anothervalue return }
arjen told me would be a good idea to use upvar. See (I haven’t tested it):
proc v {name1 name2} { upvar 1 $name1 n1 upvar 1 $name2 n2 set n1 1 set n2 2 } v N1 N2 puts "$N1 $N2"
RS: The first approach, returning a list of the results, is «cleaner» in the functional programming sense. The upvar approach creates side effects as it changes the value of variables.
Lars H: In real life, which approach is preferable varies quite a lot. There are on the whole at least three possibilities to consider:
- Return the list of the results.
- Return one result as the return value of the proc, and the others using upvared variables.
- Return all results in variables.
Taking apart a list of values returned is sometimes annoyingly cumbersome, but in other cases that list is a good thing to have. Usually it all depends on what you’re going to do with the results once you’ve got them.
One thing that is fairly easy to do using upvared variables is to provide optional results — provide an optional argument for the name of a variable in which to pass back a result, but if such an argument is not given then don’t pass the result back (perhaps avoid computing it altogether).
RS: Taking apart a list is pretty easy with the foreach … break idiom 🙂
foreach {first second third} break
Larry Smith: I still think let is more readable:
let a b c @= 1 2 3
DKF: Use lassign from 8.5 onwards.
lassign first second third
ulimit размеры файлов
В основном при работе в системе UNIX мы считаем, что ее ресурсы безграничны. Например, мы не заботимся о том, что созданный файл получится «слишком большим», а это не так уж редко в персональных компьютерах на гибких дисках. Если же мы занимаемся сопровождением и администрированием системы UNIX, то мы должны быть готовы иметь дело с ситуациями, когда превышаются различные предельные значения системы. Всегда лучше исследовать эти вопросы заранее в некритичных ситуациях, поэтому давайте рассмотрим пределы размеров файлов и их смысл.
Некоторые параметры «зашиты» в ядро системы при ее генерации. Одним из таких значений является максимальный размер файла. Он определяет наибольшее число блоков, которые может занимать файл. Этот параметр тесно связан с принятым в UNIX методом использования индексных дескрипторов файла (inodes). Это наборы указателей, среди которых первые десять указывают на блоки данных, следующий указывает на другую таблицу, следующий — на таблицу, указывающую на таблицу и т.д.
Имеется еще одно ограничение размера файла, которое определено для каждого пользователя во время работы в системе — число ulimit (user limit — пользовательский предел). Это значение устанавливается в момент вашей регистрации в системе и представляет собой число блоков по 512 байт, которые вы можете записать в любой заданный файл. В shell’е имеется команда ulimit, которая при ее вызове без аргументов выводит это число. Эта же команда позволяет вам уменьшить ваше значение ulimit. Только суперпользователь (root) может УВЕЛИЧИТЬ значения ulimit.
Побочным эффектом уменьшения значения ulimit является то, что вы не можете снова увеличить его до регистрационного значения. Значение ulimit остается таким же на все время работы вашего shell, поэтому для восстановления регистрационного значения вам необходимо выйти из системы, а затем снова зарегистрироваться.
Еще одним интересным моментом является то, что если вы установите ваше значение ulimit равным 0, вы не сможете создать никакие файлы! Максимально допустимым размером файла в данном случае является нулевой, поэтому никакой файл не может быть создан. Это представляется достаточно резонным, однако существуют такие ситуации, когда файл нулевого размера МОЖЕТ существовать. Опять же, для восстановления вашего обычного значения ulimit необходимо выйти из системы, а затем снова
зарегистрироваться.
Как отмечалось ранее, увеличить значение ulimit может только суперпользователь. Эта процедура довольно проста. Сначала нужно увеличить значение ulimit командой ulimit, а затем запустить shell. Этот новый shell имеет новое значение ulimit. Если мы хотим, чтобы система загружалась с shell, имеющим большее значение ulimit, мы можем установить программу в inittab (таблице инициализации системы), чтобы эта операция выполнялась автоматически.
Ручная настройка ядра Linux
Ручная настройка — сложный и трудоемкий процесс, но зато она позволяет понять как работает ваша система, какие функции используются и создать ядро с минимально нужным набором функций под свои потребности. Мы рассмотрим только главные шаги, которые нужно выполнить чтобы ядро собралось и заработало. Со всем остальным вам придется разбираться самому опираясь на документацию ядра. Благо в утилите настройки для каждого параметра есть обширная документация которая поможет вам понять какие еще настройки нужно включить.
Начнем. Для запуска меню настроек ядра linux наберите:
Откроется вот утилита с интерфейсом ncurses:
Как видите, некоторые обязательные опции уже включены, чтобы облегчить вам процесс настройки. Начнем с самых основных настроек. Чтобы включить параметр нажмите y, чтобы включить модулем — m, для перемещения используйте клавиши стрелок и Enter, возвратиться на уровень вверх можно кнопкой Exit Откройте пункт General Setup.
Здесь устанавливаем такие параметры:
Local Version — локальная версия ядра, будет увеличиваться при каждой сборке на единицу, чтобы новые ядра при установке не заменяли собой старые, устанавливаем значение 1.
Automatically append version information to the version string — добавлять версию в название файла ядра.
Kernel Compression Mode — режим сжатия образа ядра, самый эффективный lzma.
Default Hostname — имя компьютера, отображаемое в приглашении ввода
POSIX Message Queues — поддержка очередей POSTIX
Support for paging of anonymous memory — включаем поддержку swap
Control Group support — поддержка механизма распределения ресурсов между группами процессов
Kernel .config support и Enable access to .config through /proc/config.gz- включаем возможность извлечь конфигурацию ядра через /proc/config.gz
Здесь все, возвращаемся на уровень вверх и включаем Enable loadable module support, эта функция разрешает загрузку внешних модулей, дальше открываем его меню и включаем:
Module unloading — поддержка отключения модулей
Forced module unloading — принудительное отключение модулей
Опять возвращаемся назад и открываем Processor type and features:
Processor family (Opteron/Athlon64/Hammer/K8) — выбираем свой тип процессора.
Опять возвращаемся и переходим в раздел File systems, тут установите все нужные галочки.
Обязательно включите The Extended 3 (ext3) filesystem и The Extended 4 (ext4) filesystem — для поддержки стандартных ext3 и ext4 файловых систем
Возвращаемся и идем в Kernel hacking.
Здесь включаем Magic SysRq key — поддержка магических функций SysRq, вещь не первой необходимости, но временами полезная.
Остался еще один пункт, самый сложный, потому что вам его придется пройти самому. Device Drivers — нужно пройтись по разделам и повключать драйвера для своего оборудования. Под оборудованием я подразумеваю нестандартные жесткие диски, мышки, USB устройства, веб-камеры, Bluetooth, WIFI адаптеры, принтеры и т д.
Посмотреть какое оборудование подключено к вашей системе можно командой:
После выполнения всех действий ядро готово к сборке, но вам, скорее всего, предстоит разобраться с очень многим.
Чтобы сохранить настройки переместите указатель с помощью стрелок вправо-влево, з позиции Select в позицию Save и нажмите Enter, потом еще раз подтвердите сохранение:
Чтобы выйти нажмите пару раз кнопку Exit.
Ограничение процессов
Управление процессами в Linux позволяет контролировать практически все. Вы уже видели что можно сделать, но можно еще больше. С помощью команды ulimit и конфигурационного файла /etc/security/limits.conf вы можете ограничить процессам доступ к системным ресурсам, таким как память, файлы и процессор. Например, вы можете ограничить память процесса Linux, количество файлов и т д.
Запись в файле имеет следующий вид:
<домен> <тип> <элемент> <значение>
- домен — имя пользователя, группы или UID
- тип — вид ограничений — soft или hard
- элемент — ресурс который будет ограничен
- значение — необходимый предел
Жесткие ограничения устанавливаются суперпользователем и не могут быть изменены обычными пользователями. Мягкие, soft ограничения могут меняться пользователями с помощью команды ulimit.
Рассмотрим основные ограничения, которые можно применить к процессам:
- nofile — максимальное количество открытых файлов
- as — максимальное количество оперативной памяти
- stack — максимальный размер стека
- cpu — максимальное процессорное время
- nproc — максимальное количество ядер процессора
- locks — количество заблокированных файлов
- nice — максимальный приоритет процесса
Например, ограничим процессорное время для процессов пользователя sergiy:
Посмотреть ограничения для определенного процесса вы можете в папке proc:
Ограничения, измененные, таким образом вступят в силу после перезагрузки. Но мы можем и устанавливать ограничения для текущего командного интерпретатора и создаваемых им процессов с помощью команды ulimit.
Вот опции команды:
- -S — мягкое ограничение
- -H — жесткое ограничение
- -a — вывести всю информацию
- -f — максимальный размер создаваемых файлов
- -n — максимальное количество открытых файлов
- -s — максимальный размер стека
- -t — максимальное количество процессорного времени
- -u — максимальное количество запущенных процессов
- -v — максимальный объем виртуальной памяти
Например, мы можем установить новое ограничение для количества открываемых файлов:
Теперь смотрим:
Установим лимит оперативной памяти:
Напоминаю, что это ограничение будет актуально для всех программ, выполняемых в этом терминале.
Получение исходников ядра
Самое первое что нужно сделать — это скачать исходники ядра. Исходники лучшие брать с сайта вашего дистрибутива, если они там есть или официального сайта ядра: kernel.org. Мы рассмотрим загрузку исходников с kernel.org.
Перед тем как скачивать исходники нам нужно определиться с версией ядра которую будем собирать
Есть две основных версии релизов — стабильные (stable) и кандидаты в релизы (rc), есть, конечно, еще стабильные с длительным периодом поддержки (longterm) но важно сейчас разобраться с первыми двумя. Стабильные это, как правило, не самые новые, но зато уже хорошо протестированные ядра с минимальным количеством багов
Тестовые — наоборот, самые новые, но могут содержать различные ошибки.
Итак когда определились с версией заходим на kernel.org и скачиваем нужные исходники в формате tar.xz:
В этой статье будет использована самая новая на данный момент нестабильная версия 4.4.rc7.
Получить исходники ядра Linux можно также с помощью утилиты git. Сначала создадим папку для исходников:
Для загрузки самой последней версии наберите:
Распаковка исходников ядра
Теперь у нас есть сохраненные исходники. Переходим в папку с исходниками:
Или если загружали ядро linux с помощью браузера, то сначала создадим эту папку и скопируем в нее архив:
Распаковываем архив с помощью утилиты tar:
И переходим в папку с распакованным ядром, у меня это:
Description
Procfs is pseudo filesystem (/proc) containing information about the system resources, including currently running processes, kernel, hardware. Since procfs is pseudo(meaning false) filesystem that means it is not really existent(only exist in memory).
Altering files in /proc allows us to manipulate kernel in runtime. If we take a look at the sizes of files inside procfs we can notice that their size is 0, reason for that is they are only populated when requested by user(on the fly).
It is suggested to use sysfs over procfs because it has defined structure and procfs became a mess over time.
Default Values
- a a discussion of Tcl proc’s default argument capability.
schlenk 2004-08-03: Here’s a little proc to check if defaults were used or actual arguments were present, this can be handy if a default value is used as a don’t care token.
proc defaultvalues? {} { puts "hey: " expr { 0]]] - (]-1)} }
Trying it out:
proc test {a {b 1} {c 2}} {puts } test 1 ;# -> 2 test 1 2;# -> 1 test 1 2 3;# -> 0
HaO 2011-03-16: The above is very good. I have seen an in-proc variant like that:
proc c {a {b {}}} { if {2 == ]} { # code when optional argument b was not passed } }
Doing nonsensical things with default args:
proc defaultargs {{def a} undef} { puts } defaultargs x y ;# -> def: "x", undef: "y" catch {defaultargs x} msg puts $msg ;#-> wrong # args: should be "defaultargs ?def? undef"
По какой системе списываются средства с лицевого счета?
В нашей сети применяется авансовая система расчетов с абонентами. Это значит, что услуги предоставляются до тех пор, пока на лицевом счету абонента есть неизрасходованные средства. Расчетным периодом является календарный месяц. Абонентская плата (АП) списывается ежедневно долями, пропорциональными расходуемому трафику, но не менее 1/30 от АП. Списание денежных средств за трафик, превышающий лимит тарифа («трафик, включенный в АП»), производится каждые 15 минут. Общий счет, состоящий из АП и суммы за трафик не входящий в лимит тарифа, выставляется в конце расчетного периода.
History
Proc is a common term used primarily in game programming to refer to an event — a «procedure» — triggered under particular circumstances. For example, in WoW, a particular weapon (that hits many times) might have a 10% chance on each hit to apply a special effect, such as poison damage. When WoW users talk about «how often this weapon procs», they are talking about the likelihood of the special effect occurring.
Proc was originally short for «spec_proc» (spec_proc is short for «special procedure») which is a term used by the original programmer of Circle-MUD, Jeremy Elson. It might have been used as well by the original programmers of diku-MUD as well. Special procedures in Circle-MUD are functions that can be assigned to objects, players, and locations in the world such that each time an event occurs, the special procedure function will be invoked. Special procedures were used in Circle-MUD for a wide variety of purposes: Creating room events when a person typed a specific string of text, causing a weapon or piece of armor to perform a magical action, and even causing a MOB (mobile) to do something that it wouldn’t normally do.
Special procedures were a way of creating unique experiences that could not be achieved by simply building the dungeon and populating it with monsters. Special procedures breathed life into these worlds by introducing extra coding that enhanced the gamer’s experience without changing the underlying structure or function of the code-base. If you ever played a MUD and were walking around in a dungeon and randomly saw the text «You feel as though you are being watched,» that was probably a special procedure.[citation needed]
When developers and players were talking about these special procedures they abbreviated the term to «proc». Over time the noun also became a verb, «proced» («proc’d» or «procced»), which meant that the special procedure was invoked and performed its action. Most often, players were concerned about their weapons and whether or not the weapon would perform its special attack (a proc), and so proc must have started to take on a narrower meaning for MMORPG players who were somewhat more removed from the core combat engine and flat world of MUDs.[citation needed]
Parameter list
parameter | Description |
---|---|
root= | |
rootflags= | Root filesystem mount options. |
ro | Mount root device read-only on boot (default1). |
rw | Mount root device read-write on boot. |
initrd= | Specify the location of the initial ramdisk. For UEFI boot managers and EFISTUB, the path must be specified using backslashes () as path separators. |
init= | Run specified binary instead of as init process. The package symlinks to to use systemd. |
init=/bin/sh | Boot to shell. |
systemd.unit= | Boot to a . |
resume= | Specify a swap device to use when waking from hibernation. |
nomodeset | Disable Kernel mode setting. |
zswap.enabled | Enable Zswap. |
panic= | Time before automatic reboot on kernel panic. |
debug | Enable kernel debugging (events log level). |
mem= | Force usage of a specific amount of memory to be used. |
maxcpus= | Maximum number of processors that an SMP kernel will bring up during bootup. |
selinux= | Disable or enable SELinux at boot time. |
netdev= | Network devices parameters. |
video= | Override framebuffer video defaults. |