
- •1. Клиент-серверная организация системного программного обеспечения.
- •2. Система электронной документации.
- •5. Процессы в состоянии zombie.
- •6. Атрибуты процесса. Ключевые слова команды ps.
- •Id,state,time,sl,re,pagein,vsz,rss,lim,tsiz,%cpu,%mem, command.
- •7. Сигналы.
- •9. Встроенные команды управления атрибутом cdir
- •10. Встроенная команда изменение атрибута umask
- •11. Управление заданиями.
7. Сигналы.
Сигналы. Посылка сигналов является одной из форм межпроцессного взаимодействия. Сигнал - это способ уведомления процесса о возникновении определенной ситуации. Отправителем сигнала может быть ядро или другой процесс с такими же значениями UID, как и у принимающего сигнал процесса. Процессы с нулевыми значениями UID (права суперпользователя) могут посылать сигналы любым процессам. Сигналы имеют номера (1 - 31) и имена. Например, если процесс производит деление на 0, ядро посылает ему сигнал с номером 8 (имя FPE).
При нажатии клавиши прерывания (обычно это комбинация ^c) процессу, который в данный момент работает в интерактивном режиме, посылается сигнал с номером 2 (имя INT). При нажатии комбинации ^\ интерактивному процессу посылается сигнал с номером 3 (имя QUIT). Эти сигналы обычно приводят к завершению оперативного процесса. При нажатии ^z оперативному процессу посылается сигнал с номером 18 (имя TSTP); это сигнал остановки процесса, он приводит к образованию задания, исполнение которого в дальнейшем может быть возобновлено в интерактивном или фоновом режиме.
Существует три варианта действий процесса, получившего сигнал:
- выполнение действий по умолчанию для данного сигнала;
- процесс может проигнорировать полученный сигнал;
- процесс может перехватить сигнал и самостоятельно обработать его.
Существует команда для посылки сигнала процессу, которая в реализована как встроенная (builtin):
kill [-sigspec | -signum ] [ pid | jobspec]
Поскольку чаще всего сигналы связаны с завершением процесса, команде дано такое название (kill означает "убить"), однако при помощи этой команды можно посылать не только сигналы завершения, но и остановки и возобновления процесса. Cигнал может быть задан именем или номером, например
kill -INT 2457 # эта команда эквивалентна
kill -2 2457
Если процесс, имеющий PID 2457 исполняется, то действие этих команд идентично нажатию комбинации ^c, если же в момент посылки команд этот процесс остановлен (статус процесса T), сигнал будет запомнен в стеке и как только процесс будет продолжен (kill -CONT 2457), он немедленно получит этот сигнал и, при обработке по умолчанию будет прерван.Имена всех сигналов можно получить по команде:
kill -l (опция -- строчная буква l, не цифра 1)
Ознакомиться с пояснениями ко всем сигналам и действии обработчиков этих сигналов по умолчанию можно в руководстве man sigaction (можно man 2 sigaction, т.е. явно задать раздел 2 - SYSCALL-ы, а sigaction - это SYSCALL установки обработчиков сигналов).
Часто используемые сигналы:
1 HUP – ОТБОЙ (посылается при выходе из системы);
2 INT – ПРЕРВАТЬ (завершить выполнение, посылается текущему процессу при нажатии комбинации ^c);
3 QUIT – ВЫЙТИ (завершить выполнение с выводом файла дампа памяти, посылается текущему процессу при нажатии ^/ );
9 KILL – УНИЧТОЖИТЬ (завершить безусловно и немедленно; это наиболее "сильный" сигнал завершения, процесс может установить режим игнорирования для сигналов 2 или 3, но не для 9);
11 SEGV - НАРУШЕНИЕ_СЕГМЕНТАЦИИ (попытка процесса выйти за свой сегмент памяти);
13 PIPE - РАЗРЫВ КАНАЛА (попытка записи в канал, на другом конце которого нет читающего из канала процесса);
14 ALRM - БУДИЛЬНИК (сигнал истечения интервала времени, который
был установлен самим процессом);
15 TERM - ЗАВЕРШИТЬ (осуществить нормальное завершение, этот сигнал посылается по умолчанию, если в команде kill не задано ни номера, ни имени сигнала);
17 STOP - ОСТАНОВИТЬ (остановить выполнение безусловно и немедленно);
18 TSTP - ОСТАНОВИТЬ (остановка выполнения процесса с клавиатуры, посылается исполняемому в интерактивном режиме процессу при нажатии комбинации ^z );
19 СONT - ПРОДОЛЖИТЬ (продолжить выполнение после остановки в результате STOP или TSTP, процесс будет продолжен в фоновом режиме);
20 CHLD - ПОРОЖДЕННЫЙ ПРОЦЕСС (посылается родительскому процессу порожденным процессом при его завершении или остановке);
30 USR1 – сигнал, определяемый пользователем.
8. Типы команд. Алиасы. Функции оболочки.
Команда – это первый токен командной строки, который может быть отнесен к одному из следующих 5 типов:
- алиас, (примеры: v , l, f, a, d2 ) ;
- ключевое слово (примеры: while,case,esac,do,if,else,then);
- функция (пример будет ниже);
- builtin (пер. встроенная команда, примеры: cd,umask,jobs,fg,bg );
- утилита, исполняемый файл (примеры: ln, ls, less, chmod, ps,
top, /cell/g4011b/elebon/ prog3.pl)
Cледующая команда-builtin позволяет узнать как будет интерпретировано каждое имя при использовании его в качестве команды (первым токеном командной строки):
type [-aftpP] name [ name ] если не задано никаких опций, то для каждого имени, заданного как аргумент, с новой строки выдается его интерпретация: alias,keywords,function,builtin,«маршрутное имя исполняемого файла утилиты» или сообщение «имя не найдено».
Опции:
-t - для каждого имени выдать кратко только тип без подробного описания;
-a - для каждого имени выдать все существующие варианты интерпретации, а не только тот который будет применен – первый по приоритету в порядке как они были перечислены выше, маршрутные имена исполняемого файла ищутся по приоритету в порядке задания маршрутов поиска в переменной PATH;
-t - для каждого имени выдать кратко только тип без подробного описания;
Прежде всего оболочка проверяет не встречается ли это имя среди алиасов. Алиасом называется слово (имя алиаса), которому назначается заданная строка. При использовании этого слова как первого токена командной строки вместо слова оболочка подставит назначенную ему строку. В имени алиаса нельзя использовать символы: / $ ' = и метасимволы: \ & ; ( ) < > пробел tab и символы квотирования. Чтобы не запоминать все символы, которые нельзя использовать в имени алиаса, проще пользоваться стандартом идентификатора и для алиаса тоже – использовать в имени алиаса 63 символа: [a-zA-Z0-9_].
Команда (builtin) назначения алиаса:
alias [-p] [name[=value] . . . ]
Команда alias без аргументов или с аргументом -p выводит весь текущий состав алиасов в форме: alias name=value, каждый последующий токен вида name=value создает алиас с именем и назначает ему строку, заданную value. Значение содержащее пробел и другие особые символы должно быть экранировано. Проще всего задавать всегда значение в одинарных апострофах, обеспечивающих жесткое экранирование. Для удаления алиасов используется команда (buitlin):
unalias name . . .
Алиас является атрибутом процесса оболочки. При получении доступа к системе пользователь проходит аутентификацию и процесс, проводивший аутентификацию (процесс login или sshd, или другой в зависимости от способа доступа), порождает для пользователя login-shell, являющийся лидером сессии. При старте login_shel bash исполняет в своей среде (без порождения новых процессов) команды конфигурационного файла /etc/profile, а затем ищет один из файлов ~/.bash_profile, ~/.bash_login, ~/.profile и первый слева направо существующий из них также выполняется в среде login-shell. Конфигурационные файлы не нужно делать исполняемыми, добавляя им права 'x', поскольку они не запускаются, чтобы образовать отдельный процесс, а просто сам процесс оболочки выполняет содержащиеся в них команды. В этих файлах могут содержаться команды, назначающие алиасы для процесса оболочки. Если один и тот же алиас назначен и в общем для всех пользователей файле etc/profile и в индивидуальном для владельца процесса оболочки файле ~/.bash_login, то второе назначение перекрывает первое. Не интерактивный shell, под управлением которого выполняются скрипты (программы на языке оболочки), по умолчанию не пользуется конфигурационными файлами, но при запуске программы на языке оболочки можно заставить и его выполнить эти файлы, чтобы в скрипте можно было использовать алиасы, если в строке sha-bang скрипта задать опцию –login: #!/usr/local/bin/bash –-login
Если bash запускается не как login-shell, а из пользовательской сессии, то в своей среде он выполнит команды из конфигурационного файла владельца сессии ~/.bashrc, если таковой существует. Если не существует, то никаких алиасов в этой оболочке не будет. Чтобы они автоматически появлялись в оболочках bash, запускаемых из сессий, нужно команды, назначающие алиасы задать, в файле ~/.bashrc . Команды, назначающие алиасы можно посылать интерактивно, сделанные назначения будут работать до конца сессии.
Пример:
alias # выдается список алиасов
bash # вызываем вложенную оболочку из сессии
alias # список алиасов пуст
exit # возвращаемся в login-shell
Теперь создайте и сохраните файл ~/.bashrc (~ee ~/.bashrc), впишите в него 2-3 команды, назначающие алиасы, в качестве назначенных значений используйте конструкции или команды, которые вы понимаете и используете:
alias pSPU=’ps –O start,ppid,user’
alias cD=’pushd’
Повторите команды примера и вы увидите, что во вложенной оболочке, вызванной из сессии появились ваши алиасы. Запустите их во вложенной оболочке (перед тем как выходить в login-shell) убедитесь, что вы не ошиблись и они правильно работают. Отладив алиасы на вложенной оболочке, можете аккуратно добавить их к файлу ~/.bash_login . Постарайтесь не сделать ошибок при переносе, ошибки в этом файле могут привести к тому, что вы не сможете получить сессию когда в следующий раз захотите войти в систему. Не забывайте, что алиасы подключаются в среду оболочки только, когда она стартует, а не тогда, когда вы изменили конфигурационный файл. Поэтому, чтобы увидеть результат изменения во вложенной оболочке, нужно выйти на уровень вверх и опять войти в нее, а в login-shell нужно завершить сессию (logout), потом снова пройти аутентификацию и войти в систему.
Рассмотрим пример описания и использования функции оболочки. Прежде всего нужно послать команду определения функции, например:
function myfunc2 { echo Работает функция myfunc2; date;
echo Запустил $USER; echo –n umask=; umask; }
После этого можно вызывать многократно эту функцию как из командной строки так и из скриптов просто послав ее имя, например:
myfunc2
Будет получена следующая выдача на дисплей:
Работает функция myfunc2
Понедельник, 6 мая 2013 г. 09:23:32 (MSD)
Запустил strel
umask=0022