Несмотря на то что Solaris удовлетворяет многочисленным стандартам, некоторые программы в системе (точнее, их возможности и ключи) расходятся со стандартом XPG4. Этот стандарт (The X/Open Portability Guide, Issue 4 - XPG4) представляет собой спецификацию, описывающую программы, заголовки и интерфейсы. В частности, описывается ожидаемое поведение ряда программ UNIX и их ключи.
В тех случаях, когда поведение и ключи программ Solaris расходились
со спецификацией XPG4, изначальная версия программы под Solaris не
изменялась. вместо этого программа, совместимая с XPG4 с примерно
такими же функциональными особенностями и точно таким же именем,
помещалась в каталог /usr/xpg4/bin. Таким образом, для того, чтобы
выбрать, какие программы - оригинальные или XPG4-совместимые вы
предпочитаете использовать в своей системе, достаточно указать первым
в переменной PATH тот каталог, в котором лежат нужные
вам "по умолчанию" программы. Если первым указан каталог /usr/bin, то
при вызове команды по ее короткому имени, например, grep, а не по
полному имени файла, например, /usr/xpg4/bin/grep, будет вызываться /usr/bin/grep - оригинальная программа. Если указать в PATH первым /usr/xpg4/bin, то будет запускаться XPG4-совместимая версия. Помните,
что оригинальные программы могут располагаться также в /bin, /usr/
и /usr/.
Спецификация XPG4 включает в себя
Само ядро Solaris представляет собой множество потоков (threads),
которые выполняются параллельно. Действительно, у ядра много разных
дел, было бы странно, если бы ядро пыталось все делать
последовательно, а не параллельно. Термин threads часто переводят как
"нить", но мы будем говорить в контексте
Потоки ядра чрезвычайно "легковесные", они обладают лишь маленькими
сегментом данных и стэком. Передача
Solaris реализует многоуровневую поточную модель. Ее назначение -
разделить управление потоками пользовательского уровня и работу ядра.
Потоки пользовательского уровня имеют свою схему
Каждый
(рис 7.1) Взаимоотношения процессов в многопотоковой архитектуреinit, init, есть
родительский
В таблице pkill ниже) - реальные. Эти идентификаторы
передаются по наследству от родительского
Передача этих идентификаторов для пользовательских login
обеспечивает от имени входящего пользователя. Группой
Любой TTYID.
Получить полный список ps -ef.
Во многих системах UNIX NICE ) и
динамический PRI ). Базовый NICE, тем выше
В Solaris применяется более сложная схема планирования
Каждый
priocntl, либо посредством одноименного системного вызова.
Получить информацию о текущих dispadmin.
TERM текстовый редактор будет выдавать разные
коды управления экраном, поскольку переменная TERM используется для
задания типа терминала. Переменные TERM, PATH, USER обычно являются экспортируемыми. Из командной
строки пометить переменную как экспортируемую можно с помощью команды export:
export TERM PATH
К переменным
char *env[]
Каждый
char *argv[]
Число аргументов обязательно передается в каждый
int argc
В Solaris 9 есть шесть
| Диапазон глобальных | Очередь планирования |
|---|---|
| 159–100 | |
| 99–60 | Системные |
| 59–0 |
По умолчанию
С помощью команды
ps -cl
можно узнать глобальные dispadmin.
Существуют три варианта
В нестрогой среде реального времени период реакции должен иметь гарантированную конечную продолжительность (например, верхний предел времени, за которое приложение должно освободить процессор; в Solaris такой период составляет 5 миллисекунд).
В большинстве систем UNIX поддержки реального времени нет. Это связано с тем, что:
Решение первой из этих проблем в Solaris состоит в том, что все
страницы
Когда поток готов к выполнению, он помещается в очередь отправки на
выполнение. Каждый процессор (в многопроцессорной системе) имеет
отдельный набор очередей отправки. Состояние ожидания в очереди
отправки называется состоянием выполнения (RUN). Когда процессор
освобождается, диспетчер берет поток с наивысшим
Поток может лишиться процессорного времени и покинуть процессор по нескольким причинам:
tqexp ). Такой
уровень почти всегда ниже lwait. Так потоки
компенсируют ожидание в очереди после прерывания.Выяснить, с каким легковесным ps и ключей -L и -с:
/usr/bin/ps -efcL UID PID PPID LWP NLWP CLS PRI STIME TTY LTIME CMD root 0 0 1 1 SYS 96 00:23:03 ? 0:03 sched root 1 0 1 1 TS 59 00:23:03 ? 0:00 /etc/init - root 2 0 1 1 SYS 98 00:23:03 ? 0:00 pageout root 3 0 1 1 SYS 60 00:23:03 ? 0:00 fsflush root 314 1 1 1 TS 59 00:23:35 ? 0:00 /usr/lib/saf/sac -t 300 root 289 1 1 1 TS 59 00:23:32 ? 0:00 /usr/lib/snmp/snmpdx -y -c /etc/snmp/conf root 182 1 1 3 TS 59 00:23:22 ? 0:00 /usr/lib/autofs /automountd root 182 1 2 3 TS 59 00:23:23 ? 0:00 /usr/lib/autofs /automountd root 182 1 3 3 TS 59 00:25:23 ? 0:00 /usr/lib/autofs /automountd root 207 1 3 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 4 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 5 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 6 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 7 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 8 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 9 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 193 1 11 13 TS 59 00:23:24 ? 0:00 /usr/sbin/syslogd root 193 1 12 13 TS 59 00:23:24 ? 0:00 /usr/sbin/syslogd root 193 1 13 13 TS 59 00:23:26 ? 0:00 /usr/sbin/syslogd root 439 419 1 1 IA 39 00:24:42 pts/4 0:00 bash
Вывод этой команды здесь сильно сокращен: , CLS и PRI, в которых показаны номер легковесного
Чем больше числовое значение глобального приоритета (значение PRI), тем выше глобальный приоритет процесса.
Мы видим, что многопоточные /usr/lib/autofs/automountd и демон протоколирования /usr/sbin/syslogd ) могут одновременно иметь несколько (в колонке NLWP указано количество , с которыми ассоциирован
Таблицы диспетчера можно настроить с помощью команды dispadmin.
Настройка выполняется следующим образом: вначале таблица
диспетчера конкретного класса выводится в файл, затем файл
редактируется в текстовом редакторе и загружается обратно в таблицу
диспетчера. Вывод и загрузка таблицы осуществляется с помощью
программы dispadmin.
Чтобы узнать, какие классы доступны для редактирования, следует
запустить dispadmin с ключом -l и определить активные
dispadmin -l CONFIGURED CLASSES ================== SYS (System Class) TS (Time Sharing) FX (Fixed Priority) IA (Interactive) RT (Real Time)
Далее выводим таблицу диспетчера для выбранного класса (попробуем это
на TS ):
dispadmin -c TS -g # Time Sharing Dispatcher Configuration RES=1000 ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait PRIORITY LEVEL 200 0 50 0 50 # 0 200 0 50 0 50 # 1 200 0 50 0 50 # 2 200 0 50 0 50 # 3 200 0 50 0 50 # 4 200 0 50 0 50 # 5 200 0 50 0 50 # 6 200 0 50 0 50 # 7 200 0 50 0 50 # 8 200 0 50 0 50 # 9 160 0 51 0 51 # 10 160 1 51 0 51 # 11 160 2 51 0 51 # 12 160 3 51 0 51 # 13 160 4 51 0 51 # 14 160 5 51 0 51 # 15 160 6 51 0 51 # 16 160 7 51 0 51 # 17 160 8 51 0 51 # 18 160 9 51 0 51 # 19 120 10 52 0 52 # 20 120 11 52 0 52 # 21 120 12 52 0 52 # 22 120 13 52 0 52 # 23 120 14 52 0 52 # 24 120 15 52 0 52 # 25 120 16 52 0 52 # 26 120 17 52 0 52 # 27 120 18 52 0 52 # 28 120 19 52 0 52 # 29 80 20 53 0 53 # 30 80 21 53 0 53 # 31 80 22 53 0 53 # 32 80 23 53 0 53 # 33 80 24 53 0 53 # 34 80 25 54 0 54 # 35 80 26 54 0 54 # 36 80 27 54 0 54 # 37 80 28 54 0 54 # 38 80 29 54 0 54 # 39 40 30 55 0 55 # 40 40 31 55 0 55 # 41 40 32 55 0 55 # 42 40 33 55 0 55 # 43 40 34 55 0 55 # 44 40 35 56 0 56 # 45 40 36 57 0 57 # 46 40 37 58 0 58 # 47 40 38 58 0 58 # 48 40 39 58 0 59 # 49 40 40 58 0 59 # 50 40 41 58 0 59 # 51 40 42 58 0 59 # 52 40 43 58 0 59 # 53 40 44 58 0 59 # 54 40 45 58 0 59 # 55 40 46 58 0 59 # 56 40 47 58 0 59 # 57 40 48 58 0 59 # 58 20 49 59 32000 59 # 59
Первая строка, в которой указано значение RES, определяет, в чем
измеряется время во всей таблице RES фактически задает дискретность измерения времени для столбца ts_quantum таблицы диспетчера. Ее значение по умолчанию - 1000.
Изменять дискретность не рекомендуется. Обратная к RES величина равна
0,001, и это интерпретируется как одна тысячная секунды, т.е. одна
миллисекунда. Стало быть, по умолчанию время в столбце ts_quantum
измеряется в миллисекундах.
Как было показано в разделе "Диспетчер" выше, смысл значений, приведенных в столбцах таблицы диспетчера, следующий:
ts_quantum представляет собой максимальный период времени (квант),
в течение которого поток может оставаться в процессоре до того, как
диспетчер изменит его ts_tqexp задает ts_slpret указывает ts_maxwait указывает время в секундах, которое ts_lswait. Если ts_maxwait
равно нулю, то принимается значение по умолчанию (одна секунда);ts_lswait обозначает присваиваемый В таблицах диспетчера указываются относительные
Обратите внимание на то, что более высокоприоритетные maxwait для самого высокого
Посмотрим, как работает эта схема динамического назначения ts_maxwait ), ts_lwait ).
Вместе с новым
Если ts_tqexp ).
Дальнейшие назначения
| | квант |
|---|---|
| 40 | 40 |
| 30 | 80 |
| 20 | 120 |
| 10 | 160 |
| 0 | 200 |
| 50 | 40 |
| 40 | 40 |
| 30 | 80 |
| и т.д. | и т.д. |
Такая схема динамического назначения ts_maxwait секунд.
Фактически, это означает, что в сильно загруженной
высокоприоритетными потоками системе низкоприоритетный поток через
секунду будет становиться высокоприоритетным.
Класс реального времени ( RT ) описывается более простой таблицей
диспетчера:
# Real Time Dispatcher Configuration RES=1000 TIME QUANTUM(rt_quantum) PRIORITY LEVEL 1000 # 0 1000 # 1 1000 # 2 1000 # 3 1000 # 4 1000 # 5 1000 # 6 1000 # 7 1000 # 8 1000 # 9 800 # 10 800 # 11 800 # 12 800 # 13 800 # 14 800 # 15 800 # 16 800 # 17 800 # 18 800 # 19 600 # 20 600 # 21 600 # 22 600 # 23 600 # 24 600 # 25 600 # 26 600 # 27 600 # 28 600 # 29 400 # 30 400 # 31 400 # 32 400 # 33 400 # 34 400 # 35 400 # 36 400 # 37 400 # 38 400 # 39 200 # 40 200 # 41 200 # 42 200 # 43 200 # 44 200 # 45 200 # 46 200 # 47 200 # 48 200 # 49 100 # 50 100 # 51 100 # 52 100 # 53 100 # 54 100 # 55 100 # 56 100 # 57 100 # 58 100 # 59
Потоки реального времени выполняются до завершения или до истечения
их кванта (если в очереди стоят несколько потоков реального времени).
Потокам реального времени присваивается самый высокий абсолютный
В Solaris стандартный планировщик задач (диспетчер) старается
предоставить
В более ранних версиях Solaris этот алгоритм планирования (и соответствующий ему класс) отсутствовал, хотя в других системах аналогичный алгоритм был реализован в середине 1990-х годов, например, в IRIX 6.2.
Более детальное описание этой возможности дано по адресу http://docs.sun.com/db/doc/816-4882/6mb2ipq5n?q=scheduling+classa=view
В любой многопроцессной системе запущенные
В UNIX вся память разделена на страницы определенного одинакового
размера. Каждый pagesize.
Традиционно в литературе по системам UNIX для описания
Алгоритм, который используется для выгрузки страниц в UNIX, называется "алгоритмом часов". Предполагается, что сканер страниц памяти время от времени указывает "стрелкой" этих "часов" на случайно выбранную страницу памяти. Как только это произошло, страница становится кандидатом на выгрузку. Если в течение определенного промежутка времени к ней не произошло обращения, ее и в самом деле выгружают на диск.
Более подробно алгоритм работы менеджера виртуальной памяти рассмотрен в лекции 7 курса "Администрирование ОС Solaris".
Для функционирования системы обязательно требуется, чтобы существовал
по крайней мере один swap-раздел. При его создании рекомендуют
отвести такому разделу не менее удвоенного объема оперативной памяти.
Даже если вы являетесь сторонником выполнения этой рекомендации,
постарайтесь подойти к ней критически: создание огромного
swap-раздела, который никогда не будет использован даже наполовину,
столь же нерационально, как и создание слишком маленького
swap-раздела, который доведет систему до критической нехватки
виртуальной памяти, что чревато неожиданным и принудительным
завершением нужных
При планировании дисковой подсистемы (в частности, размера swap-разделов) важно хорошо представлять, сколько памяти может потребоваться тем программам, которые будут одновременно работать в системе. В самом деле, если в системе планируется одновременно запускать сервер баз данных, web-сервер и несколько почтовых служб, можно предположить, что памяти понадобится много. Вполне реально оценить потребности в ней эмпирически - запустите по одной копии каждого демона, умножьте объем памяти, занятой каждым из них, на число предполагаемых демонов такого типа в рабочей системе и умножьте сумму получившихся чисел еще на два - для получения разумного запаса. Если такое количество оперативной памяти физически возможно установить в компьютер, вам светит счастливая звезда! Если нет, надо прикинуть, какой объем памяти критически важен (программы должны работать одновременно, а не лежать в swap-разделе поочереди или, не дай Бог, все вместе!), и решить, сколько при этом останется программ, которым все-таки придется "отдохнуть" на диске.
При нехватке памяти ядро UNIX просто уничтожает
В ходе работы
То, какие права доступа к файлу получит
Новый файл по умолчанию получает идентификаторы владельца и группы по
наследству от umask.
Эффективный идентификатор группы
Обычно эффективные идентификаторы владельца и группы /etc/shadow. С другой стороны, нельзя давать каждому
пользователю такое право: вдруг он поменяет не только свой пароль?
Кто откажется сделать милый сюрприз коллеге? Как быть? Если вы
подумали, что выход в том, чтобы все пароли менял только
администратор, вы далеки от истины.
Идея в том, чтобы право записи в /etc/shadow дать не конкретному
пользователю, а программе passwd (как нам известно, пароль меняет
именно эта программа). К сожалению, в UNIX нет механизма, который
позволяет давать какие-либо права отдельному /etc/shadow дали пользователю root (назначив
его владельцем этого файла и разрешив запись в файл владельцу - вы
помните, как это сделать с помощью chmod?), а программу passwd
разрешили всем запускать от имени ее владельца - root.
Это право (запускать программу от имени владельца) является
специальным правом доступа к файлу, оно называется SUID (set User
ID). Фактически, файл с установленным битом SUID, отвечающим за это
право доступа, всегда запускается на выполнение с эффективным
идентификатором владельца
Как мы помним, полный вид слова прав доступа таков:
su sg t r w x r w x r w x
Старшие три бита - SUID ( su ), SGID ( sg ) и t ).
Установить бит suid или sgid можно, указав chmod права доступа в числовом виде:
chmod 4755 файл
или в мнемоническом виде:
chmod u+s файл
В некоторых системах UNIX доступна только одна из этих двух форм.
Бит установки эффективного группового идентификатора (SGID) при
запуске файла на выполнение действует сходным с SUID образом: как и в
случае бита SUID, установленный SGID вызывает присвоение
В выводе команды ls файлы с установленными битами SUID и SGID
отличаются от прочих тем, что в поле, где обычно стоит "x" (бит
выполняемости), оказывается символ "s":
-r-xr-sr-x 1 roottty 10040 Nov 4 2002 /usr/sbin/wall -r-sr-sr-x 1 rootsys 22168 Nov 4 2002 /usr/bin/passwd
Это означает, что присутствуют оба бита: и бит запускаемости, и бит
SUID (или SGID, соответственно). Если попытаться установить бит SUID
или SGID на файл, для которого в соответствующем праве доступа
(владельца или группы) не будет бита запускаемости, то система не
даст это сделать. Поскольку для каталога биты SUID и SGID имеют
другое значение, то биты SUID/SGID и биты права поиска в каталоге
могут быть установлены по отдельности. В выводе ls в правах доступа к
каталогу при отсутствии права поиска и наличии битов SUID/SGID буква
S в выводе прав доступа будет заглавной:
dr-Sr-xr-x 2 root other 512 May 10 01:48 enum -rw-r--r-- 1 root other 0 May 10 01:47 q
Обратите внимание на права доступа к каталогу enum. Объяснение смысла SUID/SGID для каталога дано в лекции 6.
Найти все файлы, у которых установлен бит SUID, можно с помощью команды
find / -perm -u+s
а файлы с установленным битом SGID - по команде
find / -perm -g+s
Чтобы не допустить взлома системы, относитесь внимательно к файлам,
права доступа к которым разрешают запускать их от чужого имени.
Появление таких файлов в системе может облегчить жизнь взломщику.
Программа passwd, например, написана таким образом, что запускающий
ее пользователь не сможет с ее помощью сделать ничего, кроме
изменения собственного пароля. Поэтому ей можно доверить запускаться
с правами пользователя root. Но где гарантия, что все остальные
программы с установленным SUID такие же? Устанавливайте бит SUID
только тем программам, которым доверяете на все сто!
Появление новых файлов с <подозрительными> правами доступа может
говорить о попытке взлома системы, поэтому при инсталляции некоторых
ОС автоматически устанавливается простой сценарий, использующий
вышеописанную команду поиска таких файлов для отслеживания
добавленных за последние сутки файлов с установленным битом SUID.
Например, во FreeBSD это делается в сценарии /etc/daily, ежедневно
проверяющем состояние системы.
Имеет смысл удостовериться в том, что все эти новые файлы появились по известной вам причине.
mail, редактор текста vi и другие программы. tostop
stty -tostop
Обратная настройка выполняется командой
stty tostop
Если tostop, то SIGSTOP. STOPPED ).
Если фоновый процесс начинает выполнять вывод на терминал в то время, когда вы работаете в текстовом редакторе или подобной программе, текст на экране может перемешаться. Это не беда: на фактическое содержание редактируемого файла это никакого влияния не оказывает. В большинстве полноэкранных программ под UNIX достаточно нажать Ctrl-L, чтобы обновить экран, и назойливые сообщения исчезнут.
Для запуска
команда
Можно запустить сборку пакета программ в фоновом режиме, и пока он собирается, выполнять другую работу:
make all
С каждым
Каждому из этих потоков сопоставлены внутренние дескрипторы файлов:
входному потоку - 0, выходному потоку - 1, потоку сообщений об
ошибках - 2. Внутренний дескриптор файла существует только в пределах
того
Поток данных, связанный с find выдала список имен файлов в файл names, а не на терминал,
следует выполнить команду
find / -name "some_name" > names
Символ правой угловой скобки > означает names ; если файл с таким именем уже
существует, то он будет уничтожен и затем будет создан новый файл с
этим именем и новым содержимым.
Для добавления вывода программы в конец файла следует использовать
конструкцию "две правые угловые скобки" >>
find / -name "some_name" >> names
В этом случае файл names будет создан, если он не существует, а если
существует, выходной поток программы find добавится в конец файла.
Можно перенаправить текст из файла во входной поток.
Если время от времени вы отправляете письма по стандартной форме, например, уведомления пользователям о том, что их домашние каталоги превышают допустимый размер, можно подготовить такое письмо в текстовом редакторе и автоматически отправлять его из скрипта, проверяющего размер каталогов, с помощью команды
mail пользователь@компьютер < файл_с_письмом
Бывает необходимо отправить пользователям не совершенно одинаковые
сообщения, а письма, в которых стандартный текст перемешан с личными
обращениями и конкретными подробностями. Тогда на помощь приходит
Это дает возможность перенаправить ввод в
mail пользователь@компьютер <<FINAL Дорогой(ая) $TARGETUSER, Вы превысили допустимый размер домашнего каталога на $OVERSIZE килобайт. Удалите ненужные Вам файлы, иначе это сделает робот! Системный администратор FINAL
Такой скрипт отправит по указанному адресу письмо, в котором вместо $TARGETUSER и $OVERSIZE будут подставлены имя и превышение лимита
того пользователя, которому предназначается письмо. Естественно, этим
переменным следует присвоить какое-то значение перед выполнением
команды, но тот фрагмент скрипта, в котором это делается, вы с
легкостью додумаете самостоятельно.
Указание в тексте значков << показывает, что все, что следует
непосредственно за ними до ближайшего символа-разделителя, является
ограничителем текста. Символ-разделитель - это любой пустой символ:
пробел, табуляция или конец строки. Все, что идет за ограничителем
текста, передается во входной поток запущенного командой FINAL или что-то еще.
Кроме того, что потоки могут быть перенаправлены в файл или из файла,
существует возможность перенаправить выходной поток одного ls во входной поток программы more, чтобы длинный список
файлов вывести поэкранно, можно так:
ls -l | more
Символ вертикальной черты "|" означает
При обработке текста часто используется конструкция, называемая конвейером, когда одновременно запускается несколько программ, которые передают данные друг другу: выходной поток первой перенаправляется во входной поток второй, выходной поток второй - во входной поток третьей и т.д.
Например, для подсчета запущенных демонов httpd можно использовать
такую конструкцию:
ps -auxw | grep httpd | wc -l
Программа ps выводит список всех grep выбирает из этого списка строки, в которых есть подстрока httpd,
а wc с ключом l подсчитывает, сколько строк оказалось в ее входном
потоке.
Программы, запущенные в конвейере, начинают работать одновременно, поэтому данные на входе второй программы оказываются так скоро, как скоро их сможет сгенерировать первая.
TERM, KILL и HUP. В разных вариантах
UNIX может быть разное количество
Обычный root, может послать
любой
С помощью команды
kill
можно послать номер_сигнала
kill -номер_сигнала PID
В некоторых системах UNIX есть возможность послать killall:
killall -номер_сигнала имя_процесса
В Solaris эта программа имеет другое значение, а именно выполняет
отправку
killall
А отправить pkill:
pkill sendmail
С помощью pkill можно отправлять TERM pkill. Например,
pkill -HUP -G other,daemon
отправит HUP (SIGHUP) всем other или daemon.
В табл. 7.2 приведен список
Кроме команды pkill системный администратор может найти удобной
команду pgrep, которая заменяет конструкцию
ps -ef | grep команда
В Solaris для получения того же результата можно ввести более короткую команду
pgrep команда
| | Номер | Значение |
|---|---|---|
SIGHUP |
1 | Разрыв связи с управляющим терминалом или управляющим |
SIGINT |
2 | Прерывание с клавиатуры |
SIGQUIT |
3 | |
SIGILL |
4 | Недопустимая инструкция |
SIGABRT |
6 | abort получен от вызванной кем-то функции abort |
SIGFPE |
8 | exception: ошибка вычислений с плавающей запятой |
SIGKILL |
9 | Безусловное завершение |
SIGSEGV |
11 | Неверный адрес памяти |
SIGPIPE |
13 | Запись в несуществующий канал |
SIGALRM |
14 | timer от функции alarm |
SIGTERM |
15 | Завершение |
SIGUSR1 |
Определяется пользователем | |
SIGUSR2 |
31,12,17 | Определяется пользователем |
SIGCHLD2 |
20,17,18 | Дочерний |
SIGCONT1 |
19,18,25 | Продолжить выполнение, если оно было остановлено |
SIGSTOP |
17,19,23 | Остановить |
SIGTSTP |
18,20,24 | Останов введен с терминала |
SIGTTIN |
21,21,26 | Ввод с терминала для |
SIGTTOU |
22,22,27 | Вывод на терминала для |
| Название | Знач. | Действие по | Событие |
|---|---|---|---|
SIGHUP |
1 | завершение | разрыв связи с терминалом |
SIGINT |
2 | завершение | прерывание |
SIGQUIT |
3 | аварийное завершение (core) | Quit (требование завершения) |
SIGILL |
4 | аварийное завершение (core) | недопустимая команда процессора |
SIGTRAP |
5 | аварийное завершение (core) | прерывание при трассировке или точка останова |
SIGABRT |
6 | аварийное завершение (core) | аварийное принудительное завершение |
SIGEMT |
7 | аварийное завершение (core) | прерывание эмуляции |
SIGFPE |
8 | аварийное завершение (core) | arithmetic exception: ошибка вычислений с плавающей запятой |
SIGKILL |
9 | безусловное завершение | требование безусловного завершения |
SIGBUS |
10 | аварийное завершение (core) | ошибка шины |
SIGSEGV |
11 | аварийное завершение (core) | ошибка сегментации (выход за пределы выделенной памяти) |
SIGSYS |
12 | аварийное завершение (core) | неверный системный вызов |
SIGPIPE |
13 | завершение | запись в несуществующий канал |
SIGALRM |
14 | завершение | timer от функции alarm |
SIGTERM |
15 | завершение | завершение |
SIGUSR1 |
16 | завершение | программируемый |
SIGUSR2 |
17 | завершение | программируемый |
SIGCHLD |
18 | действия не выполняются | изменение статуса дочернего |
SIGPWR |
19 | действия не выполняются | сбой питания или перезагрузка |
SIGWINCH |
20 | действия не выполняются | изменение размера окна |
SIGURG |
21 | действия не выполняются | состояние сокета (Urgent Socket Condition) |
SIGPOLL |
22 | завершение | Pollable Event (см. streamio (7I) ) |
SIGSTOP |
23 | остановка | требование остановки |
SIGTSTP |
24 | остановка | остановка ввода с терминала |
SIGCONT |
25 | действия не выполняются | требование продолжения |
SIGTTIN |
26 | остановка | ввода ввод с терминала для |
SIGTTOU |
27 | остановка | вывода вывод на терминал для |
SIGVTALRM |
28 | завершение | Virtual Timer Expired |
SIGPROF |
29 | завершение | Profiling Timer Expired |
SIGXCPU |
30 | аварийное завершение (core) | достижение лимита времени использования процессора ( |
SIGXFSZ |
31 | аварийное завершение (core) | превышение допустимого размера файла – getrlimit (см. getrlimit (2) ) |
SIGWAITING |
32 | действия не выполняются | зарезервировано библиотекой потоков |
SIGLWP |
33 | действия не выполняются | межпроцессный ( |
SIGFREEZE |
34 | действия не выполняются | Check point Freeze |
SIGTHAW |
35 | действия не выполняются | Check point Thaw |
SIGCANCEL |
36 | действия не выполняются | |
SIGXRES |
37 | действия не выполняются | выход за |
SIGRTMIN |
* | завершение | первый |
(SIGRTMIN+1) |
* | завершение | второй |
(SIGRTMAX-1) |
* | завершение | предпоследний |
SIGRTMAX |
* | завершение | последний |
Канал - это последовательность байт, используемая как однонаправленный поток ввода/вывода.
С точки зрения программиста, бывают именованные и неименованные
каналы, и способы обращения к ним несколько отличаются. При
использовании канала один
Сокет - это объект, который используется для межпроцессных
коммуникаций; он существует, пока какой-либо socket, который возвращает его дескриптор. Имеется несколько типов
сокетов, которые поддерживают различные возможности передачи данных.
Для каждого
Основными способами, при помощи которых
Подробнее о сокетах можно прочесть в man 3 socket .
Семафоры - это механизм, который принято использовать для контроля
доступа нескольких
Семафор по сути - это переменная, в зависимости от значения которой
доступ к тому или иному ресурсу разрешается или блокируется до его
/etc/system. Для уточнения того, какие настройки
требуются именно вашему программному обеспечению под Solaris,
обратитесь к руководству по этому ПО.
Для Oracle8i в Oracle8i
set semsys:seminfo_semmni=100set semsys:seminfo_semmsl=<10 + самое большое значение PROCESSES
среди ваших БД>set semsys:seminfo_semmns=<столько, сколько объяснено ниже>set semsys:seminfo_semopm=100set semsys:seminfo_semvmx=32767Значение seminfo_semmns рекомендуется установить равным сумме
параметров PROCESSES всех баз данных сервера, причем самый большой из
них должен быть просуммирован с коэффициентом 2, плюс еще 10 на
каждую базу данных.
Узнать текущие значения параметров семафоров (Solaris) можно с помощью команды:
sysdef | tail -25
Текущие наборы семафоров в системе (Solaris) покажет команда:
ipcs -sb
Иногда случается, что при неверном завершении
ipcrm -s semsetID
semsetID здесь означает
Для просмотра текущего списка и состояния ps. Она выдает "мгновенный снимок" таблицы
Программа ps без аргументов сообщает список
ps -ef
В системах BSD и System V программа ps имеет разные ключи, поэтому
если вы переходите от одной системы к другой, надо помнить об этих
различиях или обращаться к man ps.
Разберем подробнее, какую информацию выдает программа ps:
ps -ef | more UID PID PPID C STIME TTY TIME CMD root 0 0 0 17:43:30 ? 0:03 sched root 1 0 0 17:43:30 ? 0:00 /etc/init -s root 2 0 0 17:43:30 ? 0:00 pageout root 3 0 0 17:43:30 ? 0:00 fsflush root 349 1 0 17:43:53 ? 0:00 /usr/lib/saf/sac -t 300 root 277 276 0 17:43:49 ? 0:00 htt_server -port 9010 -syslog -message_locale C root 180 1 0 17:43:45 ? 0:00 /usr/lib/autofs/automountd root 59 1 0 17:43:39 ? 0:00 /usr/lib/sysevent/syseventd root 73 1 0 17:43:40 ? 0:00 /usr/lib/picl/picld root 133 1 0 17:43:43 ? 0:00 /usr/sbin/rpcbind root 229 1 0 17:43:48 ? 0:00 /usr/lib/power/powerd root 172 1 0 17:43:44 ? 0:00 /usr/lib/nfs/lockd root 156 1 0 17:43:44 ? 0:00 /usr/sbin/inetd -s root 217 1 0 17:43:47 ? 0:00 /usr/lib/lpsched daemon 168 1 0 17:43:44 ? 0:00 /usr/lib/nfs/statd root 189 1 0 17:43:45 ? 0:00 /usr/sbin/syslogd root 203 1 0 17:43:46 ? 0:00 /usr/sbin/cron root 205 1 0 17:43:46 ? 0:00 /usr/sbin/nscd root 343 1 0 17:43:53 ? 0:00 /usr/sbin/vold root 240 1 0 17:43:48 ? 0:00 /usr/lib/utmpd root 324 1 0 17:43:51 ? 0:00 /usr/lib/snmp/snmpdx -y -c /etc/snmp/conf root 261 1 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot root 355 329 0 17:43:56 ? 0:00 /usr/dt/bin/dtlogin -daemon root 329 1 0 17:43:52 ? 0:00 /usr/dt/bin/dtlogin -daemon root 262 261 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot root 263 261 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot root 354 1 0 17:43:55 ? 0:00 /usr/lib/ssh/sshd root 338 1 0 17:43:52 ? 0:00 /usr/lib/dmi/snmpXdmid -s sunny root 352 349 0 17:43:53 ? 0:00 /usr/lib/saf/ttymon root 353 329 2 17:43:54 ? 1:41 /usr/openwin/bin/Xsun :0 -nobanner -auth /var/dt/A:0-KtaiPa root 356 329 0 17:43:56 ? 0:00 /usr/openwin/bin/fbconsole -d :0 root 358 324 0 17:43:57 ? 0:00 mibiisa -r -p 5248 root 337 1 0 17:43:52 ? 0:00 /usr/lib/dmi/dmispd
Ниже мы описываем смысл колонок этого вывода. Некоторые колонки
появятся только при использовании специфических ключей, отличных от
ключей ef. Для получения еще более детальной информации следует
обратиться к man ps.
UID - эффективный идентификатор владельца -f ).
В колонке F - flags (флаги) - выводятся флаги
В колонке S - state (состояние) - указывается состояние
O (ON PROC) - S (Sleeping) - R (Runnable) - Z (Zombie) - T (sTopped) - Идентификатор PID - уникальный идентификатор
- идентификатор родительского
C - загрузка процессора на планирование задачи (устарело, выводится
для совместимости).
CLS -
PRI - -с, бо'льшие значения
означают больший -с бо'льшие значения означают
меньший
NI - значение NICE (показателя уступчивости), используется при
вычислении глобального
ADDR - адрес в памяти.
SZ - размер pagesize.
WCHAN - адрес события, ради которого
STIME - время запуска
TTY - управляющий терминал (то же, что и терминальная группа), символ
вопросительного знака "?" печатается для
TIME - число минут и секунд, указывающее, сколько времени
CMD - команда, которой был запущен
При указании ключа j выводятся дополнительные сведения:
PGID - идентификатор лидера группы
SID - идентификатор
При указании ключа L выводятся дополнительные сведения, причем
информация выдается по одной строке на каждый легковесный
- идентификатор легковесного
NLWP - число легковесных
Завершившиеся
Кроме программы ps в UNIX для получения информации о запущенных в
данный момент top:
top last pid: 923; load averages: 4.56, 1.18, 0.50 17:54:22 64 processes: 63 sleeping, 1 on cpu CPU states: 0.0% idle, 0.5% user, 99.5% kernel, 0.0% iowait, 0.0% swap Memory: 128M real, 18M free, 101M swap in use, 499M swap free PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND 909 root 1 60 0 17M 3340K sleep 0:00 0.92% pagein 353 root 1 58 0 32M 16M sleep 0:05 0.37% Xsun 893 root 1 49 0 2228K 1172K cpu 0:00 0.15% top 753 root 1 49 0 15M 8112K sleep 0:00 0.13% dtterm 911 root 1 59 0 3352K 752K sleep 0:00 0.03% sh 912 root 1 49 0 3360K 600K sleep 0:00 0.03% sh 894 root 1 59 0 3064K 1816K sleep 0:00 0.03% dtexec 656 root 5 59 0 22M 10M sleep 0:01 0.02% dtwm 648 root 1 59 0 6644K 2280K sleep 0:00 0.02% ttsession 667 root 1 59 0 1844K 512K sleep 0:00 0.02% rpc.rstatd 277 root 29 59 0 5612K 1724K sleep 0:00 0.01% htt_server 895 root 1 59 0 3360K 756K sleep 0:00 0.01% soffice 720 root 4 49 0 42M 26M sleep 0:03 0.00% mozilla-bin 649 root 1 49 0 18M 6288K sleep 0:00 0.00% dtsession 760 root 1 49 0 4752K 1656K sleep 0:00 0.00% bash
В Solaris для удобства получения информации о
pgrep имя
Она является эквивалентом команды
ps -ef | grep имя
С помощью pargs можно посмотреть, какие аргументы переданы конкретному
pargs 2793 2793: dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/bin/dtexec -open argv[0]: dtterm argv[1]: -e argv[2]: /usr/dt/bin/dtexec argv[3]: -open argv[4]: -1 argv[5]: -ttprocid argv[6]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 sunny_105_1 argv[7]: /export/home/mozilla_bin/sfw/bin/mozilla argv[8]: <NULL> argv[9]: -open argv[10]: -1 argv[11]: -ttprocid argv[12]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 sunny_105_1 argv[13]: /export/home/mozilla_bin/sfw/bin/mozilla pargs -e 2793 2793: dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/bin/dtexec -open envp[0]: AB_CARDCATALOG=/usr/dt/share/answerbooks/ru_RU.UTF-8/ab_cardcatalog envp[1]: DISPLAY=:0.0 envp[2]: DTAPPSEARCHPATH=//.dt/appmanager:/etc/dt/appconfig/appmanager/%L:/etc/dt/appconfig/appmanager/C:/usr/dt/appconfig/appmanager/%L:/usr/dt/appconfig/appmanager/C envp[3]: DTDATABASESEARCHPATH=//.dt/types,/etc/dt/appconfig/types/%L,/etc/dt/appconfig/types/C,/usr/dt/appconfig/types/%L,/usr/dt/appconfig/types/C
Вывод команды pargs значительно сокращен, ключ -e требует вывести все
содержимое dtterm,
как в нашем примере,
Команда prstat позволяет в динамике, подобно команде top, отслеживать
состояние
prstat PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 3576 root 3412K 868K run 13 0 0:00:02 6,3% find/1 353 root 45M 19M sleep 59 0 0:02:30 0,2% Xsun/1 753 root 15M 3620K run 49 0 0:00:02 0,1% dtterm/1 3577 root 6640K 4108K cpu0 49 0 0:00:00 0,1% prstat/1 205 root 2872K 624K sleep 59 0 0:00:00 0,0% nscd/18 895 root 123M 21M sleep 49 0 0:00:49 0,0% soffice.bin/4 667 root 1844K 488K sleep 59 0 0:00:00 0,0% rpc.rstatd/1 217 root 5364K 536K sleep 59 0 0:00:00 0,0% lpsched/1 324 root 4360K 196K sleep 59 0 0:00:00 0,0% snmpdx/1 240 root 1100K 288K sleep 59 0 0:00:00 0,0% utmpd/1 343 root 4892K 0K sleep 59 0 0:00:00 0,0% vold/3 276 root 3240K 0K sleep 59 0 0:00:00 0,0% htt/1 633 root 3784K 0K sleep 59 0 0:00:00 0,0% sdt_shell/1 657 root 16M 2496K sleep 49 0 0:00:00 0,0% dtfile/1 203 root 4484K 568K sleep 59 0 0:00:00 0,0% cron/1 189 root 5636K 1092K sleep 59 0 0:00:00 0,0% syslogd/13 168 daemon 2444K 820K sleep 59 0 0:00:00 0,0% statd/1 156 root 2412K 688K sleep 59 0 0:00:00 0,0% inetd/1 172 root 2160K 748K sleep 59 0 0:00:00 0,0% lockd/2 229 root 1348K 0K sleep 59 0 0:00:00 0,0% powerd/2 133 root 2212K 604K sleep 59 0 0:00:00 0,0% rpcbind/1 Total: 61 processes, 161 lwps, load averages: 0,25, 0,17, 0,27
Вы можете получить информацию только о тех root доступна информация о любых
В Solaris 9 появилась новая программа preap, которая позволяет убрать
из системы "мнимые" (defunct), не до конца завершившиеся init, но если
этого почему-либо не произошло, можно воспользоваться программой preap, которая примет код завершения процесса-зомби и даст ему
упокоиться с миром.
Основным средством kill,
передающая nice,
для управления
Не следует путать команду kill с KILL - они просто тезки; с
помощью одноименной команды можно передать KILL,
так и любые другие
Будучи запущенной без ключей, она передает TERM,
требующий завершения
kill [-ключи] номер_процесса
Например, для завершения sendmail можно выполнить следующие действия:
:
ps auxw | grep sendmail
root 2057 0.0 0.2 2664 444 ? S Jul08 3:24 sendmail:
accepting connections
Как видно, sendmail имеет PID 2057. Посылаем
kill 2057
И повторяем последнее действие для проверки (контрольный выстрел):
kill 2057 kill: (2057) - No such pid
Сообщение No such pid говорит о том, что
Программу kill можно использовать для передачи любых
Например, после изменений, внесенных в файл конфигурации /etc/inetd.conf, следует потребовать от демона inetd перечитать этот
файл конфигурации.
Это можно сделать, послав демону HUP (номер один), так как
известно, что этот демон перечитывает файлы конфигурации, если
получает
ps -ef | grep inetd root 156 1 0 17:43:44 ? 0:00 /usr/sbin/inetd -s root 4555 760 0 19:15:16 pts/5 0:00 grep inetd
Мы видим два inetd. Первая строка, grep inetd - это тот самый grep,
который мы только что сами запустили. Программы ps и grep запустились
одновременно, и ps показал "мгновенный снимок" таблицы
Строка grep inetd в таком случае должна была бы показываться всегда,
но на практике иногда мы не видим ее при запуске такой команды.
Проведите эксперимент: возможно, что в вашей системе (это зависит от
ее скорости и текущей загрузки) вы никогда не увидите строку grep или
наоборот, будете ее видеть всегда.
Это связано с тем, что физически запуск grep происходит чуть-чуть
позже, чем ps, последняя может успеть завершиться раньше, чем grep
начнется (ведь таблица ps будет мало). Тогда строки про grep в списке найденных
Теперь пошлем inetd:
kill -1 156
Помните, не все демоны и не во всех системах по HUP
перечитывают свой файл конфигурации. Прежде чем посылать демону
Владелец root ) может отправить любой
Посылка KILL (номер 9) вызывает безусловное немедленное
завершение
kill -9 PID
или
kill -KILL PID
При выполнении команды kill лучше указывать мнемонические обозначения
Для посылки pkill или killall (их подробное описание
приведено в разделе "Сигналы" выше в этой лекции).
При запуске NICE в обе
стороны. Для этого используется команда nice, которая в разных
системах имеет разные ключи и немного разный синтаксис.
В Solaris она выглядит так:
nice -n приращение команда
например
nice -n 5 ls
Это "5" воспринимается как увеличение значения NICE на 5, т.е.
снижение root может дать команду
вида nice -n -4 ls. Это будет воспринято как увеличение базового NICE на 4.
Базовый renice:
renice -n приращение PID
Команда renice может быть использована также для изменения man
renice.
Заданием называют запущенные одной командой несколько программ (в
частном случае это может быть и одна программа). Для управления
заданиями можно использовать встроенные команды командных
интерпретаторов. Так, в большинстве из них есть команды jobs, bg и fg
- для получения информации о заданиях, переключении задания в фоновый
или
Более подробно о работе с заданиями говорится в лекции 9.
Вынесете ли вы сегодня мусор или пойдете в магазин, поедете на заправку кормить своего железного коня бензином или просто ляжете спать пораньше - так или иначе, какое-нибудь дело вы сегодня сделаете. Дела, которые вы делаете, могут быть однократными (купить щенка) или регулярными (погулять с собакой). Может быть, "однократные" - не совсем точное прилагательное, потому что щенка вы можете купить и раз, и два, и еще много раз в жизни. Но вряд ли это дело можно назвать регулярным - не станете же вы раз в год ровно в полночь 13 марта покупать щенка.
Все-таки станете? Вы не сатанист, часом?
Еще приятнее запланировать выполнение нерегулярного или регулярного дела так, чтобы его делал кто-то другой. Например, сообщите сыну, что вы просите его завтра в полдень отправиться в клуб собаководов и купить там щеночка. Однократно. А потом (когда купит) скажите, что вы запланировали его (сына) прогулки с ним (щеночком) ежедневно - на годы вперед.
Системный администратор, даже если у него нет сына и щеночка, тоже не
лишен радостей планирования. Так, для планирования однократных
действий в любом UNIX используется программа at, а для регулярных - crontab.
Для планирования однократного запуска задач в строго определенное
время (точность - одна минута) используется программа at. Она создает
и изменяет список задач для выполнения, размещая его в каталоге /var/spool/cron/atjobs/. В Solaris это именно такой каталог, в других
системах местоположение очереди задач может быть иным. Список задач
ежеминутно инспектируется демоном cron, который отвечает за
своевременный запуск задач. Во многих других системах UNIX демон cron
не отвечает за задания, запланированные с помощью at, а для последних
имеется специальный демон-запускатель - atd.
Чтобы at могла верно запланировать задачи, следует указать ей время и
дату запуска задачи:
at time date
Параметр time может быть задан в форме HH:MM (часы:минуты), или
словом midnight, noon, now, или временем с суффиксом AM или PM в
североамериканском формате. Дата должна быть либо в формате название_месяца день [год], либо MMDDYY, либо MM/DD/YY, либо DD.MM.YY. Также можно указать время в виде now+ n единицы, где
единицы - это minutes, hours, days, weeks. Можно указать для времени
суффикс today или tomorrow.
Указание time без date означает выполнение задачи в текущие сутки, а
если time сегодня уже прошло, - назавтра в указанное время.
Программа at принимает список задач для выполнения во входной поток.
at -l (или atq ) распечатывает список поставленных в очередь задач.
at -r позволяет удалить задачу по идентификатору, который показывает at -l.
В некоторых системах at -r называется atrm. В Solaris приемлемы оба
варианта.
Суперпользователь всегда может воспользоваться at.
Обычному пользователю разрешается использовать at в случае, если его
имя указано в файле /usr/lib/cron/at.allow. Если этого файла нет, то
проверяется, нет ли имени пользователя в /usr/lib/cron/at.deny (если
есть, ему запрещается использование at ). Если ни одного из этих двух
файлов нет, пользоваться at разрешается только пользователям, которым
назначена роль solaris.jobs.user (по умолчанию - root ). Если есть
только файл /usr/lib/cron/at.deny и он пуст, то по умолчанию всем
разрешено пользоваться at. В файлах at.deny и at.allow имена
пользователей пишутся по одному в строке.
Задания at и crontab заблокированного пользователя не запускаются -
демон cron запустит задания только того пользователя, который имеет
легальный доступ в систему в настоящее время, как отражено в файле /etc/shadow.
Задание, запущенное на выполнение демоном cron, выполняется от имени
пользователя, который поставил задание в очередь. Стандартный вывод и
стандартный поток ошибок задания cron высылает почтой этому
пользователю. Можно указать иное место для вывода информации с
помощью ключа m команды at или с помощью параметра в файле crontab
(см. ниже). Запланированные задачи выполняются в среде командного
процессора /bin/sh без назначения
Проведем небольшой эксперимент. Вначале убедимся, что каталог, где
сохраняются задания at, пуст:
#ls /var/spool/cron/atjobs/ #
Проверим время и дату:
date Сбт 15 Май 2004 19:10:29
Запланируем создание файла в корневом каталоге через две минуты:
at 1912 at> touch /tuition at> <Ctrl-D> commands will be executed using /sbin/sh job 1084633920.a at Сбт Май 15 19:12:00 2004
В каталоге, где собираются задания в очереди на выполнение, появился новый файл:
ls /var/spool/cron/atjobs/ 1084633920.a
И по команде at -l мы получаем информацию о поставленном в очередь
задании (указывается имя пользователя, инициировавшего задание,
идентификатор задания, по которому его можно удалить, и время
планируемого запуска):
at -l user = root 1084633920.a Сбт Май 15 19:12:00 2004
Пока в корневом каталоге файла tuition нет:
ls / bin devices lib opt tmp xfn boot etc lost+found platform TT_DB cdrom export mnt proc usr core home net sbin var dev kernel nsmail test vol
Почему? Да время еще не наступило:
date Сбт 15 Май 2004 19:11:42
Дожидаемся заданного времени и (о чудо!) файл /tuition появился! Смотрите:
date Сбт 15 Май 2004 19:12:12 ls / bin devices lib opt tmp vol boot etc lost+found platform TT_DB xfn cdrom export mnt proc tuition core home net sbin usr dev kernel nsmail test var
Демон cron ежеминутно инспектирует таблицу запланированных задач и
выполняет те задачи, время которых наступило (в Solaris - не более
100 задач в минуту). Программа at нужна, как видно из раздела "at"
выше, для планирования однократных задач, а программа crontab служит
для планирования периодически запускаемых cron.
У каждого пользователя есть своя таблица crontab. Ее можно
отредактировать командой crontab -e. По этой команде вызывается
текстовый редактор (обычно - vi ), а в качестве файла для
редактирования окажется таблица crontab. Если вы раньше не задавали
никаких периодических задач, файл будет пустым.
Формат таблицы crontab: каждая строка описывает одну задачу, в строке
содержится шесть полей:
mm hh dd mo dw command
mm - минуты от 0 до 59;
hh - часы от 0 до 23;
dd - числа от 1 до 31;
mo - месяцы от 1 до 12;
dw - дни недели от 0 до 7, 0 и 7 - это воскресенье;
command - команда командному процессору, которую надо запустить (возможно, с аргументами).
Каждое числовое поле в таблице может содержать число, несколько чисел через запятую, диапазон (начало и конец диапазона через дефис) или звездочку. Звездочка в соответствующем поле означает "каждую единицу времени", например в поле часов она означает "каждый час".
Если в строке указаны определенное число месяца и определенный день недели, то для выполнения команды достаточно, чтобы наступило либо это число, либо этот день недели.
Так, строка
12 10 * * 0 rm -rf /var/log/*.[0-9]
означает, что в 10:12 каждое воскресенье нужно удалять файлы *.[0-9] из /var/log.
Однако, если было бы написано
12 10 10 * 0 rm -rf /var/log/*.[0-9]
то требовалось бы выполнять такое удаление "в 10:12 по воскресеньям и десятым числам", а не "в 10:12 десятого числа, если оно приходится на воскресенье".
Как и в случае с at, команда запускается от имени владельца таблицы,
в качестве командного процессора используется /bin/sh.
В первых строках таблицы могут быть установлены переменные PATH:
PATH=/usr/bin:/usr/sbin:/usr/local/bin
В ней можно задать каталоги, которые по умолчанию не входят в PATH.
Кроме PATH можно установить переменные SHELL и HOME, а также MAILTO.
По умолчанию HOME (домашний каталог) берется из /etc/passwd.
Переменная LOGNAME устанавливается автоматически при запуске команды.
Ей присваивается имя пользователя, от имени которого запускается
команда. В BSD-системах она может называться USER, в Solaris есть обе
переменные. LOGNAME и USER нельзя переопределить, HOME и SHELL -
можно. Программа cron отправит сообщение владельцу таблицы crontab,
если найдет повод это сделать (например, произошла ошибка выполнения
команды). Если переменная MAILTO существует и ее значение отлично от
пустой строки, то cron расценит это значение как имя адресата,
которому надо послать письмо вместо пользователя, запланировавшего
задачу. Если значение переменной MAILTO - пустая строка, то почта
послана не будет. Установка любой переменной crontab осуществляется так:
имя_переменной = значение
пробелы вокруг знака равенства необязательны, а пробелы после значения будут трактоваться как часть значения. Поэтому значение лучше заключать в апострофы или кавычки для явного указания пробелов в начале и конце значения.
Для просмотра таблицы crontab используйте команду crontab -l, для
удаления таблицы - crontab -r. Можно создать файл с таблицей crontab
заранее и установить ее в систему командой
crontab имя_файла_таблицы.
Такая команда потенциально опасна: если раньше существовали
какие-либо команды в таблице crontab, то они потеряются навсегда.
В Solaris нет стандартно принятых по умолчанию регулярно выполняемых
скриптов. Однако рекомендуется их создать и расположить в каталоге /var/admin/cron/ или /etc/periodic/.
crontab -e 22 * * * * /var/admin/cron/hourly 22 22 * * * /var/admin/cron/daily 2 22 * * 0 /var/admin/cron/weekly 2 2 1 * * /var/admin/cron/monthly
В скрипт hourly рекомендуется включать проверку состояния сетевого
подсоединения ( ping ), проверку и при необходимости установку прав
доступа к почтовым ящикам пользователей, проверку состояния основных
демонов ( syslog, sendmail, named, sshd ) с помощью ps, архивацию и
обновление файлов протоколов ( log rotation ), которые достаточно
выросли за час (рекомендуемый размер файла протокола для архивации -
1-2 мегабайта, но вы можете выбрать иное, исходя из удобства
последующего анализа этого файла).
В скрипт daily включают проверку очереди сообщений (не слишком ли
велика - запустите mailq ), синхронизацию системного времени ( ntpdate, rdate ).
В скрипт weekly включают проверку свободного места на диске (если у
вас это приходится делать чаще, чем раз в неделю, имеет смысл
подумать о покупке нового диска, а может быть, и двух сразу),
проверку файлов passwd, shadow, hosts.allow и hosts.deny, файлов
конфигурации ftpd, sendmail, протоколов utmp и wtmp на предмет прав
доступа и размера.
Ежемесячный скрипт monthly обычно содержит архивацию и обновление тех
файлов протоколов, которые растут медленно.
Вы можете включить в эти скрипты свои задачи, которые являются
специфическими для конкретной системы - проверку конфигурации smbd
для файлового сервера samba, проверку дисковых квот пользователей,
контроль появления свежих файлов с установленным битом SUID и так
далее.
Несмотря на то что Solaris удовлетворяет многочисленным стандартам, некоторые программы в системе (точнее, их возможности и ключи) расходятся со стандартом XPG4. Этот стандарт (The X/Open Portability Guide, Issue 4 - XPG4) представляет собой спецификацию, описывающую программы, заголовки и интерфейсы. В частности, описывается ожидаемое поведение ряда программ UNIX и их ключи.
В тех случаях, когда поведение и ключи программ Solaris расходились
со спецификацией XPG4, изначальная версия программы под Solaris не
изменялась. вместо этого программа, совместимая с XPG4 с примерно
такими же функциональными особенностями и точно таким же именем,
помещалась в каталог /usr/xpg4/bin. Таким образом, для того, чтобы
выбрать, какие программы - оригинальные или XPG4-совместимые вы
предпочитаете использовать в своей системе, достаточно указать первым
в переменной PATH тот каталог, в котором лежат нужные
вам "по умолчанию" программы. Если первым указан каталог /usr/bin, то
при вызове команды по ее короткому имени, например, grep, а не по
полному имени файла, например, /usr/xpg4/bin/grep, будет вызываться /usr/bin/grep - оригинальная программа. Если указать в PATH первым /usr/xpg4/bin, то будет запускаться XPG4-совместимая версия. Помните,
что оригинальные программы могут располагаться также в /bin, /usr/
и /usr/.
Спецификация XPG4 включает в себя
Само ядро Solaris представляет собой множество потоков (threads),
которые выполняются параллельно. Действительно, у ядра много разных
дел, было бы странно, если бы ядро пыталось все делать
последовательно, а не параллельно. Термин threads часто переводят как
"нить", но мы будем говорить в контексте
Потоки ядра чрезвычайно "легковесные", они обладают лишь маленькими
сегментом данных и стэком. Передача
Solaris реализует многоуровневую поточную модель. Ее назначение -
разделить управление потоками пользовательского уровня и работу ядра.
Потоки пользовательского уровня имеют свою схему
Каждый
(рис 7.1) Взаимоотношения процессов в многопотоковой архитектуреinit, init, есть
родительский
В таблице pkill ниже) - реальные. Эти идентификаторы
передаются по наследству от родительского
Передача этих идентификаторов для пользовательских login
обеспечивает от имени входящего пользователя. Группой
Любой TTYID.
Получить полный список ps -ef.
Во многих системах UNIX NICE ) и
динамический PRI ). Базовый NICE, тем выше
В Solaris применяется более сложная схема планирования
Каждый
priocntl, либо посредством одноименного системного вызова.
Получить информацию о текущих dispadmin.
TERM текстовый редактор будет выдавать разные
коды управления экраном, поскольку переменная TERM используется для
задания типа терминала. Переменные TERM, PATH, USER обычно являются экспортируемыми. Из командной
строки пометить переменную как экспортируемую можно с помощью команды export:
export TERM PATH
К переменным
char *env[]
Каждый
char *argv[]
Число аргументов обязательно передается в каждый
int argc
В Solaris 9 есть шесть
| Диапазон глобальных | Очередь планирования |
|---|---|
| 159–100 | |
| 99–60 | Системные |
| 59–0 |
По умолчанию
С помощью команды
ps -cl
можно узнать глобальные dispadmin.
Существуют три варианта
В нестрогой среде реального времени период реакции должен иметь гарантированную конечную продолжительность (например, верхний предел времени, за которое приложение должно освободить процессор; в Solaris такой период составляет 5 миллисекунд).
В большинстве систем UNIX поддержки реального времени нет. Это связано с тем, что:
Решение первой из этих проблем в Solaris состоит в том, что все
страницы
Когда поток готов к выполнению, он помещается в очередь отправки на
выполнение. Каждый процессор (в многопроцессорной системе) имеет
отдельный набор очередей отправки. Состояние ожидания в очереди
отправки называется состоянием выполнения (RUN). Когда процессор
освобождается, диспетчер берет поток с наивысшим
Поток может лишиться процессорного времени и покинуть процессор по нескольким причинам:
tqexp ). Такой
уровень почти всегда ниже lwait. Так потоки
компенсируют ожидание в очереди после прерывания.Выяснить, с каким легковесным ps и ключей -L и -с:
/usr/bin/ps -efcL UID PID PPID LWP NLWP CLS PRI STIME TTY LTIME CMD root 0 0 1 1 SYS 96 00:23:03 ? 0:03 sched root 1 0 1 1 TS 59 00:23:03 ? 0:00 /etc/init - root 2 0 1 1 SYS 98 00:23:03 ? 0:00 pageout root 3 0 1 1 SYS 60 00:23:03 ? 0:00 fsflush root 314 1 1 1 TS 59 00:23:35 ? 0:00 /usr/lib/saf/sac -t 300 root 289 1 1 1 TS 59 00:23:32 ? 0:00 /usr/lib/snmp/snmpdx -y -c /etc/snmp/conf root 182 1 1 3 TS 59 00:23:22 ? 0:00 /usr/lib/autofs /automountd root 182 1 2 3 TS 59 00:23:23 ? 0:00 /usr/lib/autofs /automountd root 182 1 3 3 TS 59 00:25:23 ? 0:00 /usr/lib/autofs /automountd root 207 1 3 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 4 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 5 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 6 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 7 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 8 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 207 1 9 18 TS 59 00:23:25 ? 0:00 /usr/sbin/nscd root 193 1 11 13 TS 59 00:23:24 ? 0:00 /usr/sbin/syslogd root 193 1 12 13 TS 59 00:23:24 ? 0:00 /usr/sbin/syslogd root 193 1 13 13 TS 59 00:23:26 ? 0:00 /usr/sbin/syslogd root 439 419 1 1 IA 39 00:24:42 pts/4 0:00 bash
Вывод этой команды здесь сильно сокращен: , CLS и PRI, в которых показаны номер легковесного
Чем больше числовое значение глобального приоритета (значение PRI), тем выше глобальный приоритет процесса.
Мы видим, что многопоточные /usr/lib/autofs/automountd и демон протоколирования /usr/sbin/syslogd ) могут одновременно иметь несколько (в колонке NLWP указано количество , с которыми ассоциирован
Таблицы диспетчера можно настроить с помощью команды dispadmin.
Настройка выполняется следующим образом: вначале таблица
диспетчера конкретного класса выводится в файл, затем файл
редактируется в текстовом редакторе и загружается обратно в таблицу
диспетчера. Вывод и загрузка таблицы осуществляется с помощью
программы dispadmin.
Чтобы узнать, какие классы доступны для редактирования, следует
запустить dispadmin с ключом -l и определить активные
dispadmin -l CONFIGURED CLASSES ================== SYS (System Class) TS (Time Sharing) FX (Fixed Priority) IA (Interactive) RT (Real Time)
Далее выводим таблицу диспетчера для выбранного класса (попробуем это
на TS ):
dispadmin -c TS -g # Time Sharing Dispatcher Configuration RES=1000 ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait PRIORITY LEVEL 200 0 50 0 50 # 0 200 0 50 0 50 # 1 200 0 50 0 50 # 2 200 0 50 0 50 # 3 200 0 50 0 50 # 4 200 0 50 0 50 # 5 200 0 50 0 50 # 6 200 0 50 0 50 # 7 200 0 50 0 50 # 8 200 0 50 0 50 # 9 160 0 51 0 51 # 10 160 1 51 0 51 # 11 160 2 51 0 51 # 12 160 3 51 0 51 # 13 160 4 51 0 51 # 14 160 5 51 0 51 # 15 160 6 51 0 51 # 16 160 7 51 0 51 # 17 160 8 51 0 51 # 18 160 9 51 0 51 # 19 120 10 52 0 52 # 20 120 11 52 0 52 # 21 120 12 52 0 52 # 22 120 13 52 0 52 # 23 120 14 52 0 52 # 24 120 15 52 0 52 # 25 120 16 52 0 52 # 26 120 17 52 0 52 # 27 120 18 52 0 52 # 28 120 19 52 0 52 # 29 80 20 53 0 53 # 30 80 21 53 0 53 # 31 80 22 53 0 53 # 32 80 23 53 0 53 # 33 80 24 53 0 53 # 34 80 25 54 0 54 # 35 80 26 54 0 54 # 36 80 27 54 0 54 # 37 80 28 54 0 54 # 38 80 29 54 0 54 # 39 40 30 55 0 55 # 40 40 31 55 0 55 # 41 40 32 55 0 55 # 42 40 33 55 0 55 # 43 40 34 55 0 55 # 44 40 35 56 0 56 # 45 40 36 57 0 57 # 46 40 37 58 0 58 # 47 40 38 58 0 58 # 48 40 39 58 0 59 # 49 40 40 58 0 59 # 50 40 41 58 0 59 # 51 40 42 58 0 59 # 52 40 43 58 0 59 # 53 40 44 58 0 59 # 54 40 45 58 0 59 # 55 40 46 58 0 59 # 56 40 47 58 0 59 # 57 40 48 58 0 59 # 58 20 49 59 32000 59 # 59
Первая строка, в которой указано значение RES, определяет, в чем
измеряется время во всей таблице RES фактически задает дискретность измерения времени для столбца ts_quantum таблицы диспетчера. Ее значение по умолчанию - 1000.
Изменять дискретность не рекомендуется. Обратная к RES величина равна
0,001, и это интерпретируется как одна тысячная секунды, т.е. одна
миллисекунда. Стало быть, по умолчанию время в столбце ts_quantum
измеряется в миллисекундах.
Как было показано в разделе "Диспетчер" выше, смысл значений, приведенных в столбцах таблицы диспетчера, следующий:
ts_quantum представляет собой максимальный период времени (квант),
в течение которого поток может оставаться в процессоре до того, как
диспетчер изменит его ts_tqexp задает ts_slpret указывает ts_maxwait указывает время в секундах, которое ts_lswait. Если ts_maxwait
равно нулю, то принимается значение по умолчанию (одна секунда);ts_lswait обозначает присваиваемый В таблицах диспетчера указываются относительные
Обратите внимание на то, что более высокоприоритетные maxwait для самого высокого
Посмотрим, как работает эта схема динамического назначения ts_maxwait ), ts_lwait ).
Вместе с новым
Если ts_tqexp ).
Дальнейшие назначения
| | квант |
|---|---|
| 40 | 40 |
| 30 | 80 |
| 20 | 120 |
| 10 | 160 |
| 0 | 200 |
| 50 | 40 |
| 40 | 40 |
| 30 | 80 |
| и т.д. | и т.д. |
Такая схема динамического назначения ts_maxwait секунд.
Фактически, это означает, что в сильно загруженной
высокоприоритетными потоками системе низкоприоритетный поток через
секунду будет становиться высокоприоритетным.
Класс реального времени ( RT ) описывается более простой таблицей
диспетчера:
# Real Time Dispatcher Configuration RES=1000 TIME QUANTUM(rt_quantum) PRIORITY LEVEL 1000 # 0 1000 # 1 1000 # 2 1000 # 3 1000 # 4 1000 # 5 1000 # 6 1000 # 7 1000 # 8 1000 # 9 800 # 10 800 # 11 800 # 12 800 # 13 800 # 14 800 # 15 800 # 16 800 # 17 800 # 18 800 # 19 600 # 20 600 # 21 600 # 22 600 # 23 600 # 24 600 # 25 600 # 26 600 # 27 600 # 28 600 # 29 400 # 30 400 # 31 400 # 32 400 # 33 400 # 34 400 # 35 400 # 36 400 # 37 400 # 38 400 # 39 200 # 40 200 # 41 200 # 42 200 # 43 200 # 44 200 # 45 200 # 46 200 # 47 200 # 48 200 # 49 100 # 50 100 # 51 100 # 52 100 # 53 100 # 54 100 # 55 100 # 56 100 # 57 100 # 58 100 # 59
Потоки реального времени выполняются до завершения или до истечения
их кванта (если в очереди стоят несколько потоков реального времени).
Потокам реального времени присваивается самый высокий абсолютный
В Solaris стандартный планировщик задач (диспетчер) старается
предоставить
В более ранних версиях Solaris этот алгоритм планирования (и соответствующий ему класс) отсутствовал, хотя в других системах аналогичный алгоритм был реализован в середине 1990-х годов, например, в IRIX 6.2.
Более детальное описание этой возможности дано по адресу http://docs.sun.com/db/doc/816-4882/6mb2ipq5n?q=scheduling+classa=view
В любой многопроцессной системе запущенные
В UNIX вся память разделена на страницы определенного одинакового
размера. Каждый pagesize.
Традиционно в литературе по системам UNIX для описания
Алгоритм, который используется для выгрузки страниц в UNIX, называется "алгоритмом часов". Предполагается, что сканер страниц памяти время от времени указывает "стрелкой" этих "часов" на случайно выбранную страницу памяти. Как только это произошло, страница становится кандидатом на выгрузку. Если в течение определенного промежутка времени к ней не произошло обращения, ее и в самом деле выгружают на диск.
Более подробно алгоритм работы менеджера виртуальной памяти рассмотрен в лекции 7 курса "Администрирование ОС Solaris".
Для функционирования системы обязательно требуется, чтобы существовал
по крайней мере один swap-раздел. При его создании рекомендуют
отвести такому разделу не менее удвоенного объема оперативной памяти.
Даже если вы являетесь сторонником выполнения этой рекомендации,
постарайтесь подойти к ней критически: создание огромного
swap-раздела, который никогда не будет использован даже наполовину,
столь же нерационально, как и создание слишком маленького
swap-раздела, который доведет систему до критической нехватки
виртуальной памяти, что чревато неожиданным и принудительным
завершением нужных
При планировании дисковой подсистемы (в частности, размера swap-разделов) важно хорошо представлять, сколько памяти может потребоваться тем программам, которые будут одновременно работать в системе. В самом деле, если в системе планируется одновременно запускать сервер баз данных, web-сервер и несколько почтовых служб, можно предположить, что памяти понадобится много. Вполне реально оценить потребности в ней эмпирически - запустите по одной копии каждого демона, умножьте объем памяти, занятой каждым из них, на число предполагаемых демонов такого типа в рабочей системе и умножьте сумму получившихся чисел еще на два - для получения разумного запаса. Если такое количество оперативной памяти физически возможно установить в компьютер, вам светит счастливая звезда! Если нет, надо прикинуть, какой объем памяти критически важен (программы должны работать одновременно, а не лежать в swap-разделе поочереди или, не дай Бог, все вместе!), и решить, сколько при этом останется программ, которым все-таки придется "отдохнуть" на диске.
При нехватке памяти ядро UNIX просто уничтожает
В ходе работы
То, какие права доступа к файлу получит
Новый файл по умолчанию получает идентификаторы владельца и группы по
наследству от umask.
Эффективный идентификатор группы
Обычно эффективные идентификаторы владельца и группы /etc/shadow. С другой стороны, нельзя давать каждому
пользователю такое право: вдруг он поменяет не только свой пароль?
Кто откажется сделать милый сюрприз коллеге? Как быть? Если вы
подумали, что выход в том, чтобы все пароли менял только
администратор, вы далеки от истины.
Идея в том, чтобы право записи в /etc/shadow дать не конкретному
пользователю, а программе passwd (как нам известно, пароль меняет
именно эта программа). К сожалению, в UNIX нет механизма, который
позволяет давать какие-либо права отдельному /etc/shadow дали пользователю root (назначив
его владельцем этого файла и разрешив запись в файл владельцу - вы
помните, как это сделать с помощью chmod?), а программу passwd
разрешили всем запускать от имени ее владельца - root.
Это право (запускать программу от имени владельца) является
специальным правом доступа к файлу, оно называется SUID (set User
ID). Фактически, файл с установленным битом SUID, отвечающим за это
право доступа, всегда запускается на выполнение с эффективным
идентификатором владельца
Как мы помним, полный вид слова прав доступа таков:
su sg t r w x r w x r w x
Старшие три бита - SUID ( su ), SGID ( sg ) и t ).
Установить бит suid или sgid можно, указав chmod права доступа в числовом виде:
chmod 4755 файл
или в мнемоническом виде:
chmod u+s файл
В некоторых системах UNIX доступна только одна из этих двух форм.
Бит установки эффективного группового идентификатора (SGID) при
запуске файла на выполнение действует сходным с SUID образом: как и в
случае бита SUID, установленный SGID вызывает присвоение
В выводе команды ls файлы с установленными битами SUID и SGID
отличаются от прочих тем, что в поле, где обычно стоит "x" (бит
выполняемости), оказывается символ "s":
-r-xr-sr-x 1 roottty 10040 Nov 4 2002 /usr/sbin/wall -r-sr-sr-x 1 rootsys 22168 Nov 4 2002 /usr/bin/passwd
Это означает, что присутствуют оба бита: и бит запускаемости, и бит
SUID (или SGID, соответственно). Если попытаться установить бит SUID
или SGID на файл, для которого в соответствующем праве доступа
(владельца или группы) не будет бита запускаемости, то система не
даст это сделать. Поскольку для каталога биты SUID и SGID имеют
другое значение, то биты SUID/SGID и биты права поиска в каталоге
могут быть установлены по отдельности. В выводе ls в правах доступа к
каталогу при отсутствии права поиска и наличии битов SUID/SGID буква
S в выводе прав доступа будет заглавной:
dr-Sr-xr-x 2 root other 512 May 10 01:48 enum -rw-r--r-- 1 root other 0 May 10 01:47 q
Обратите внимание на права доступа к каталогу enum. Объяснение смысла SUID/SGID для каталога дано в лекции 6.
Найти все файлы, у которых установлен бит SUID, можно с помощью команды
find / -perm -u+s
а файлы с установленным битом SGID - по команде
find / -perm -g+s
Чтобы не допустить взлома системы, относитесь внимательно к файлам,
права доступа к которым разрешают запускать их от чужого имени.
Появление таких файлов в системе может облегчить жизнь взломщику.
Программа passwd, например, написана таким образом, что запускающий
ее пользователь не сможет с ее помощью сделать ничего, кроме
изменения собственного пароля. Поэтому ей можно доверить запускаться
с правами пользователя root. Но где гарантия, что все остальные
программы с установленным SUID такие же? Устанавливайте бит SUID
только тем программам, которым доверяете на все сто!
Появление новых файлов с <подозрительными> правами доступа может
говорить о попытке взлома системы, поэтому при инсталляции некоторых
ОС автоматически устанавливается простой сценарий, использующий
вышеописанную команду поиска таких файлов для отслеживания
добавленных за последние сутки файлов с установленным битом SUID.
Например, во FreeBSD это делается в сценарии /etc/daily, ежедневно
проверяющем состояние системы.
Имеет смысл удостовериться в том, что все эти новые файлы появились по известной вам причине.
mail, редактор текста vi и другие программы. tostop
stty -tostop
Обратная настройка выполняется командой
stty tostop
Если tostop, то SIGSTOP. STOPPED ).
Если фоновый процесс начинает выполнять вывод на терминал в то время, когда вы работаете в текстовом редакторе или подобной программе, текст на экране может перемешаться. Это не беда: на фактическое содержание редактируемого файла это никакого влияния не оказывает. В большинстве полноэкранных программ под UNIX достаточно нажать Ctrl-L, чтобы обновить экран, и назойливые сообщения исчезнут.
Для запуска
команда
Можно запустить сборку пакета программ в фоновом режиме, и пока он собирается, выполнять другую работу:
make all
С каждым
Каждому из этих потоков сопоставлены внутренние дескрипторы файлов:
входному потоку - 0, выходному потоку - 1, потоку сообщений об
ошибках - 2. Внутренний дескриптор файла существует только в пределах
того
Поток данных, связанный с find выдала список имен файлов в файл names, а не на терминал,
следует выполнить команду
find / -name "some_name" > names
Символ правой угловой скобки > означает names ; если файл с таким именем уже
существует, то он будет уничтожен и затем будет создан новый файл с
этим именем и новым содержимым.
Для добавления вывода программы в конец файла следует использовать
конструкцию "две правые угловые скобки" >>
find / -name "some_name" >> names
В этом случае файл names будет создан, если он не существует, а если
существует, выходной поток программы find добавится в конец файла.
Можно перенаправить текст из файла во входной поток.
Если время от времени вы отправляете письма по стандартной форме, например, уведомления пользователям о том, что их домашние каталоги превышают допустимый размер, можно подготовить такое письмо в текстовом редакторе и автоматически отправлять его из скрипта, проверяющего размер каталогов, с помощью команды
mail пользователь@компьютер < файл_с_письмом
Бывает необходимо отправить пользователям не совершенно одинаковые
сообщения, а письма, в которых стандартный текст перемешан с личными
обращениями и конкретными подробностями. Тогда на помощь приходит
Это дает возможность перенаправить ввод в
mail пользователь@компьютер <<FINAL Дорогой(ая) $TARGETUSER, Вы превысили допустимый размер домашнего каталога на $OVERSIZE килобайт. Удалите ненужные Вам файлы, иначе это сделает робот! Системный администратор FINAL
Такой скрипт отправит по указанному адресу письмо, в котором вместо $TARGETUSER и $OVERSIZE будут подставлены имя и превышение лимита
того пользователя, которому предназначается письмо. Естественно, этим
переменным следует присвоить какое-то значение перед выполнением
команды, но тот фрагмент скрипта, в котором это делается, вы с
легкостью додумаете самостоятельно.
Указание в тексте значков << показывает, что все, что следует
непосредственно за ними до ближайшего символа-разделителя, является
ограничителем текста. Символ-разделитель - это любой пустой символ:
пробел, табуляция или конец строки. Все, что идет за ограничителем
текста, передается во входной поток запущенного командой FINAL или что-то еще.
Кроме того, что потоки могут быть перенаправлены в файл или из файла,
существует возможность перенаправить выходной поток одного ls во входной поток программы more, чтобы длинный список
файлов вывести поэкранно, можно так:
ls -l | more
Символ вертикальной черты "|" означает
При обработке текста часто используется конструкция, называемая конвейером, когда одновременно запускается несколько программ, которые передают данные друг другу: выходной поток первой перенаправляется во входной поток второй, выходной поток второй - во входной поток третьей и т.д.
Например, для подсчета запущенных демонов httpd можно использовать
такую конструкцию:
ps -auxw | grep httpd | wc -l
Программа ps выводит список всех grep выбирает из этого списка строки, в которых есть подстрока httpd,
а wc с ключом l подсчитывает, сколько строк оказалось в ее входном
потоке.
Программы, запущенные в конвейере, начинают работать одновременно, поэтому данные на входе второй программы оказываются так скоро, как скоро их сможет сгенерировать первая.
TERM, KILL и HUP. В разных вариантах
UNIX может быть разное количество
Обычный root, может послать
любой
С помощью команды
kill
можно послать номер_сигнала
kill -номер_сигнала PID
В некоторых системах UNIX есть возможность послать killall:
killall -номер_сигнала имя_процесса
В Solaris эта программа имеет другое значение, а именно выполняет
отправку
killall
А отправить pkill:
pkill sendmail
С помощью pkill можно отправлять TERM pkill. Например,
pkill -HUP -G other,daemon
отправит HUP (SIGHUP) всем other или daemon.
В табл. 7.2 приведен список
Кроме команды pkill системный администратор может найти удобной
команду pgrep, которая заменяет конструкцию
ps -ef | grep команда
В Solaris для получения того же результата можно ввести более короткую команду
pgrep команда
| | Номер | Значение |
|---|---|---|
SIGHUP |
1 | Разрыв связи с управляющим терминалом или управляющим |
SIGINT |
2 | Прерывание с клавиатуры |
SIGQUIT |
3 | |
SIGILL |
4 | Недопустимая инструкция |
SIGABRT |
6 | abort получен от вызванной кем-то функции abort |
SIGFPE |
8 | exception: ошибка вычислений с плавающей запятой |
SIGKILL |
9 | Безусловное завершение |
SIGSEGV |
11 | Неверный адрес памяти |
SIGPIPE |
13 | Запись в несуществующий канал |
SIGALRM |
14 | timer от функции alarm |
SIGTERM |
15 | Завершение |
SIGUSR1 |
Определяется пользователем | |
SIGUSR2 |
31,12,17 | Определяется пользователем |
SIGCHLD2 |
20,17,18 | Дочерний |
SIGCONT1 |
19,18,25 | Продолжить выполнение, если оно было остановлено |
SIGSTOP |
17,19,23 | Остановить |
SIGTSTP |
18,20,24 | Останов введен с терминала |
SIGTTIN |
21,21,26 | Ввод с терминала для |
SIGTTOU |
22,22,27 | Вывод на терминала для |
| Название | Знач. | Действие по | Событие |
|---|---|---|---|
SIGHUP |
1 | завершение | разрыв связи с терминалом |
SIGINT |
2 | завершение | прерывание |
SIGQUIT |
3 | аварийное завершение (core) | Quit (требование завершения) |
SIGILL |
4 | аварийное завершение (core) | недопустимая команда процессора |
SIGTRAP |
5 | аварийное завершение (core) | прерывание при трассировке или точка останова |
SIGABRT |
6 | аварийное завершение (core) | аварийное принудительное завершение |
SIGEMT |
7 | аварийное завершение (core) | прерывание эмуляции |
SIGFPE |
8 | аварийное завершение (core) | arithmetic exception: ошибка вычислений с плавающей запятой |
SIGKILL |
9 | безусловное завершение | требование безусловного завершения |
SIGBUS |
10 | аварийное завершение (core) | ошибка шины |
SIGSEGV |
11 | аварийное завершение (core) | ошибка сегментации (выход за пределы выделенной памяти) |
SIGSYS |
12 | аварийное завершение (core) | неверный системный вызов |
SIGPIPE |
13 | завершение | запись в несуществующий канал |
SIGALRM |
14 | завершение | timer от функции alarm |
SIGTERM |
15 | завершение | завершение |
SIGUSR1 |
16 | завершение | программируемый |
SIGUSR2 |
17 | завершение | программируемый |
SIGCHLD |
18 | действия не выполняются | изменение статуса дочернего |
SIGPWR |
19 | действия не выполняются | сбой питания или перезагрузка |
SIGWINCH |
20 | действия не выполняются | изменение размера окна |
SIGURG |
21 | действия не выполняются | состояние сокета (Urgent Socket Condition) |
SIGPOLL |
22 | завершение | Pollable Event (см. streamio (7I) ) |
SIGSTOP |
23 | остановка | требование остановки |
SIGTSTP |
24 | остановка | остановка ввода с терминала |
SIGCONT |
25 | действия не выполняются | требование продолжения |
SIGTTIN |
26 | остановка | ввода ввод с терминала для |
SIGTTOU |
27 | остановка | вывода вывод на терминал для |
SIGVTALRM |
28 | завершение | Virtual Timer Expired |
SIGPROF |
29 | завершение | Profiling Timer Expired |
SIGXCPU |
30 | аварийное завершение (core) | достижение лимита времени использования процессора ( |
SIGXFSZ |
31 | аварийное завершение (core) | превышение допустимого размера файла – getrlimit (см. getrlimit (2) ) |
SIGWAITING |
32 | действия не выполняются | зарезервировано библиотекой потоков |
SIGLWP |
33 | действия не выполняются | межпроцессный ( |
SIGFREEZE |
34 | действия не выполняются | Check point Freeze |
SIGTHAW |
35 | действия не выполняются | Check point Thaw |
SIGCANCEL |
36 | действия не выполняются | |
SIGXRES |
37 | действия не выполняются | выход за |
SIGRTMIN |
* | завершение | первый |
(SIGRTMIN+1) |
* | завершение | второй |
(SIGRTMAX-1) |
* | завершение | предпоследний |
SIGRTMAX |
* | завершение | последний |
Канал - это последовательность байт, используемая как однонаправленный поток ввода/вывода.
С точки зрения программиста, бывают именованные и неименованные
каналы, и способы обращения к ним несколько отличаются. При
использовании канала один
Сокет - это объект, который используется для межпроцессных
коммуникаций; он существует, пока какой-либо socket, который возвращает его дескриптор. Имеется несколько типов
сокетов, которые поддерживают различные возможности передачи данных.
Для каждого
Основными способами, при помощи которых
Подробнее о сокетах можно прочесть в man 3 socket .
Семафоры - это механизм, который принято использовать для контроля
доступа нескольких
Семафор по сути - это переменная, в зависимости от значения которой
доступ к тому или иному ресурсу разрешается или блокируется до его
/etc/system. Для уточнения того, какие настройки
требуются именно вашему программному обеспечению под Solaris,
обратитесь к руководству по этому ПО.
Для Oracle8i в Oracle8i
set semsys:seminfo_semmni=100set semsys:seminfo_semmsl=<10 + самое большое значение PROCESSES
среди ваших БД>set semsys:seminfo_semmns=<столько, сколько объяснено ниже>set semsys:seminfo_semopm=100set semsys:seminfo_semvmx=32767Значение seminfo_semmns рекомендуется установить равным сумме
параметров PROCESSES всех баз данных сервера, причем самый большой из
них должен быть просуммирован с коэффициентом 2, плюс еще 10 на
каждую базу данных.
Узнать текущие значения параметров семафоров (Solaris) можно с помощью команды:
sysdef | tail -25
Текущие наборы семафоров в системе (Solaris) покажет команда:
ipcs -sb
Иногда случается, что при неверном завершении
ipcrm -s semsetID
semsetID здесь означает
Для просмотра текущего списка и состояния ps. Она выдает "мгновенный снимок" таблицы
Программа ps без аргументов сообщает список
ps -ef
В системах BSD и System V программа ps имеет разные ключи, поэтому
если вы переходите от одной системы к другой, надо помнить об этих
различиях или обращаться к man ps.
Разберем подробнее, какую информацию выдает программа ps:
ps -ef | more UID PID PPID C STIME TTY TIME CMD root 0 0 0 17:43:30 ? 0:03 sched root 1 0 0 17:43:30 ? 0:00 /etc/init -s root 2 0 0 17:43:30 ? 0:00 pageout root 3 0 0 17:43:30 ? 0:00 fsflush root 349 1 0 17:43:53 ? 0:00 /usr/lib/saf/sac -t 300 root 277 276 0 17:43:49 ? 0:00 htt_server -port 9010 -syslog -message_locale C root 180 1 0 17:43:45 ? 0:00 /usr/lib/autofs/automountd root 59 1 0 17:43:39 ? 0:00 /usr/lib/sysevent/syseventd root 73 1 0 17:43:40 ? 0:00 /usr/lib/picl/picld root 133 1 0 17:43:43 ? 0:00 /usr/sbin/rpcbind root 229 1 0 17:43:48 ? 0:00 /usr/lib/power/powerd root 172 1 0 17:43:44 ? 0:00 /usr/lib/nfs/lockd root 156 1 0 17:43:44 ? 0:00 /usr/sbin/inetd -s root 217 1 0 17:43:47 ? 0:00 /usr/lib/lpsched daemon 168 1 0 17:43:44 ? 0:00 /usr/lib/nfs/statd root 189 1 0 17:43:45 ? 0:00 /usr/sbin/syslogd root 203 1 0 17:43:46 ? 0:00 /usr/sbin/cron root 205 1 0 17:43:46 ? 0:00 /usr/sbin/nscd root 343 1 0 17:43:53 ? 0:00 /usr/sbin/vold root 240 1 0 17:43:48 ? 0:00 /usr/lib/utmpd root 324 1 0 17:43:51 ? 0:00 /usr/lib/snmp/snmpdx -y -c /etc/snmp/conf root 261 1 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot root 355 329 0 17:43:56 ? 0:00 /usr/dt/bin/dtlogin -daemon root 329 1 0 17:43:52 ? 0:00 /usr/dt/bin/dtlogin -daemon root 262 261 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot root 263 261 0 17:43:49 ? 0:00 /usr/sadm/lib/smc/bin/smcboot root 354 1 0 17:43:55 ? 0:00 /usr/lib/ssh/sshd root 338 1 0 17:43:52 ? 0:00 /usr/lib/dmi/snmpXdmid -s sunny root 352 349 0 17:43:53 ? 0:00 /usr/lib/saf/ttymon root 353 329 2 17:43:54 ? 1:41 /usr/openwin/bin/Xsun :0 -nobanner -auth /var/dt/A:0-KtaiPa root 356 329 0 17:43:56 ? 0:00 /usr/openwin/bin/fbconsole -d :0 root 358 324 0 17:43:57 ? 0:00 mibiisa -r -p 5248 root 337 1 0 17:43:52 ? 0:00 /usr/lib/dmi/dmispd
Ниже мы описываем смысл колонок этого вывода. Некоторые колонки
появятся только при использовании специфических ключей, отличных от
ключей ef. Для получения еще более детальной информации следует
обратиться к man ps.
UID - эффективный идентификатор владельца -f ).
В колонке F - flags (флаги) - выводятся флаги
В колонке S - state (состояние) - указывается состояние
O (ON PROC) - S (Sleeping) - R (Runnable) - Z (Zombie) - T (sTopped) - Идентификатор PID - уникальный идентификатор
- идентификатор родительского
C - загрузка процессора на планирование задачи (устарело, выводится
для совместимости).
CLS -
PRI - -с, бо'льшие значения
означают больший -с бо'льшие значения означают
меньший
NI - значение NICE (показателя уступчивости), используется при
вычислении глобального
ADDR - адрес в памяти.
SZ - размер pagesize.
WCHAN - адрес события, ради которого
STIME - время запуска
TTY - управляющий терминал (то же, что и терминальная группа), символ
вопросительного знака "?" печатается для
TIME - число минут и секунд, указывающее, сколько времени
CMD - команда, которой был запущен
При указании ключа j выводятся дополнительные сведения:
PGID - идентификатор лидера группы
SID - идентификатор
При указании ключа L выводятся дополнительные сведения, причем
информация выдается по одной строке на каждый легковесный
- идентификатор легковесного
NLWP - число легковесных
Завершившиеся
Кроме программы ps в UNIX для получения информации о запущенных в
данный момент top:
top last pid: 923; load averages: 4.56, 1.18, 0.50 17:54:22 64 processes: 63 sleeping, 1 on cpu CPU states: 0.0% idle, 0.5% user, 99.5% kernel, 0.0% iowait, 0.0% swap Memory: 128M real, 18M free, 101M swap in use, 499M swap free PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND 909 root 1 60 0 17M 3340K sleep 0:00 0.92% pagein 353 root 1 58 0 32M 16M sleep 0:05 0.37% Xsun 893 root 1 49 0 2228K 1172K cpu 0:00 0.15% top 753 root 1 49 0 15M 8112K sleep 0:00 0.13% dtterm 911 root 1 59 0 3352K 752K sleep 0:00 0.03% sh 912 root 1 49 0 3360K 600K sleep 0:00 0.03% sh 894 root 1 59 0 3064K 1816K sleep 0:00 0.03% dtexec 656 root 5 59 0 22M 10M sleep 0:01 0.02% dtwm 648 root 1 59 0 6644K 2280K sleep 0:00 0.02% ttsession 667 root 1 59 0 1844K 512K sleep 0:00 0.02% rpc.rstatd 277 root 29 59 0 5612K 1724K sleep 0:00 0.01% htt_server 895 root 1 59 0 3360K 756K sleep 0:00 0.01% soffice 720 root 4 49 0 42M 26M sleep 0:03 0.00% mozilla-bin 649 root 1 49 0 18M 6288K sleep 0:00 0.00% dtsession 760 root 1 49 0 4752K 1656K sleep 0:00 0.00% bash
В Solaris для удобства получения информации о
pgrep имя
Она является эквивалентом команды
ps -ef | grep имя
С помощью pargs можно посмотреть, какие аргументы переданы конкретному
pargs 2793 2793: dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/bin/dtexec -open argv[0]: dtterm argv[1]: -e argv[2]: /usr/dt/bin/dtexec argv[3]: -open argv[4]: -1 argv[5]: -ttprocid argv[6]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 sunny_105_1 argv[7]: /export/home/mozilla_bin/sfw/bin/mozilla argv[8]: <NULL> argv[9]: -open argv[10]: -1 argv[11]: -ttprocid argv[12]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 sunny_105_1 argv[13]: /export/home/mozilla_bin/sfw/bin/mozilla pargs -e 2793 2793: dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/bin/dtexec -open envp[0]: AB_CARDCATALOG=/usr/dt/share/answerbooks/ru_RU.UTF-8/ab_cardcatalog envp[1]: DISPLAY=:0.0 envp[2]: DTAPPSEARCHPATH=//.dt/appmanager:/etc/dt/appconfig/appmanager/%L:/etc/dt/appconfig/appmanager/C:/usr/dt/appconfig/appmanager/%L:/usr/dt/appconfig/appmanager/C envp[3]: DTDATABASESEARCHPATH=//.dt/types,/etc/dt/appconfig/types/%L,/etc/dt/appconfig/types/C,/usr/dt/appconfig/types/%L,/usr/dt/appconfig/types/C
Вывод команды pargs значительно сокращен, ключ -e требует вывести все
содержимое dtterm,
как в нашем примере,
Команда prstat позволяет в динамике, подобно команде top, отслеживать
состояние
prstat PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 3576 root 3412K 868K run 13 0 0:00:02 6,3% find/1 353 root 45M 19M sleep 59 0 0:02:30 0,2% Xsun/1 753 root 15M 3620K run 49 0 0:00:02 0,1% dtterm/1 3577 root 6640K 4108K cpu0 49 0 0:00:00 0,1% prstat/1 205 root 2872K 624K sleep 59 0 0:00:00 0,0% nscd/18 895 root 123M 21M sleep 49 0 0:00:49 0,0% soffice.bin/4 667 root 1844K 488K sleep 59 0 0:00:00 0,0% rpc.rstatd/1 217 root 5364K 536K sleep 59 0 0:00:00 0,0% lpsched/1 324 root 4360K 196K sleep 59 0 0:00:00 0,0% snmpdx/1 240 root 1100K 288K sleep 59 0 0:00:00 0,0% utmpd/1 343 root 4892K 0K sleep 59 0 0:00:00 0,0% vold/3 276 root 3240K 0K sleep 59 0 0:00:00 0,0% htt/1 633 root 3784K 0K sleep 59 0 0:00:00 0,0% sdt_shell/1 657 root 16M 2496K sleep 49 0 0:00:00 0,0% dtfile/1 203 root 4484K 568K sleep 59 0 0:00:00 0,0% cron/1 189 root 5636K 1092K sleep 59 0 0:00:00 0,0% syslogd/13 168 daemon 2444K 820K sleep 59 0 0:00:00 0,0% statd/1 156 root 2412K 688K sleep 59 0 0:00:00 0,0% inetd/1 172 root 2160K 748K sleep 59 0 0:00:00 0,0% lockd/2 229 root 1348K 0K sleep 59 0 0:00:00 0,0% powerd/2 133 root 2212K 604K sleep 59 0 0:00:00 0,0% rpcbind/1 Total: 61 processes, 161 lwps, load averages: 0,25, 0,17, 0,27
Вы можете получить информацию только о тех root доступна информация о любых
В Solaris 9 появилась новая программа preap, которая позволяет убрать
из системы "мнимые" (defunct), не до конца завершившиеся init, но если
этого почему-либо не произошло, можно воспользоваться программой preap, которая примет код завершения процесса-зомби и даст ему
упокоиться с миром.
Основным средством kill,
передающая nice,
для управления
Не следует путать команду kill с KILL - они просто тезки; с
помощью одноименной команды можно передать KILL,
так и любые другие
Будучи запущенной без ключей, она передает TERM,
требующий завершения
kill [-ключи] номер_процесса
Например, для завершения sendmail можно выполнить следующие действия:
:
ps auxw | grep sendmail
root 2057 0.0 0.2 2664 444 ? S Jul08 3:24 sendmail:
accepting connections
Как видно, sendmail имеет PID 2057. Посылаем
kill 2057
И повторяем последнее действие для проверки (контрольный выстрел):
kill 2057 kill: (2057) - No such pid
Сообщение No such pid говорит о том, что
Программу kill можно использовать для передачи любых
Например, после изменений, внесенных в файл конфигурации /etc/inetd.conf, следует потребовать от демона inetd перечитать этот
файл конфигурации.
Это можно сделать, послав демону HUP (номер один), так как
известно, что этот демон перечитывает файлы конфигурации, если
получает
ps -ef | grep inetd root 156 1 0 17:43:44 ? 0:00 /usr/sbin/inetd -s root 4555 760 0 19:15:16 pts/5 0:00 grep inetd
Мы видим два inetd. Первая строка, grep inetd - это тот самый grep,
который мы только что сами запустили. Программы ps и grep запустились
одновременно, и ps показал "мгновенный снимок" таблицы
Строка grep inetd в таком случае должна была бы показываться всегда,
но на практике иногда мы не видим ее при запуске такой команды.
Проведите эксперимент: возможно, что в вашей системе (это зависит от
ее скорости и текущей загрузки) вы никогда не увидите строку grep или
наоборот, будете ее видеть всегда.
Это связано с тем, что физически запуск grep происходит чуть-чуть
позже, чем ps, последняя может успеть завершиться раньше, чем grep
начнется (ведь таблица ps будет мало). Тогда строки про grep в списке найденных
Теперь пошлем inetd:
kill -1 156
Помните, не все демоны и не во всех системах по HUP
перечитывают свой файл конфигурации. Прежде чем посылать демону
Владелец root ) может отправить любой
Посылка KILL (номер 9) вызывает безусловное немедленное
завершение
kill -9 PID
или
kill -KILL PID
При выполнении команды kill лучше указывать мнемонические обозначения
Для посылки pkill или killall (их подробное описание
приведено в разделе "Сигналы" выше в этой лекции).
При запуске NICE в обе
стороны. Для этого используется команда nice, которая в разных
системах имеет разные ключи и немного разный синтаксис.
В Solaris она выглядит так:
nice -n приращение команда
например
nice -n 5 ls
Это "5" воспринимается как увеличение значения NICE на 5, т.е.
снижение root может дать команду
вида nice -n -4 ls. Это будет воспринято как увеличение базового NICE на 4.
Базовый renice:
renice -n приращение PID
Команда renice может быть использована также для изменения man
renice.
Заданием называют запущенные одной командой несколько программ (в
частном случае это может быть и одна программа). Для управления
заданиями можно использовать встроенные команды командных
интерпретаторов. Так, в большинстве из них есть команды jobs, bg и fg
- для получения информации о заданиях, переключении задания в фоновый
или
Более подробно о работе с заданиями говорится в лекции 9.
Вынесете ли вы сегодня мусор или пойдете в магазин, поедете на заправку кормить своего железного коня бензином или просто ляжете спать пораньше - так или иначе, какое-нибудь дело вы сегодня сделаете. Дела, которые вы делаете, могут быть однократными (купить щенка) или регулярными (погулять с собакой). Может быть, "однократные" - не совсем точное прилагательное, потому что щенка вы можете купить и раз, и два, и еще много раз в жизни. Но вряд ли это дело можно назвать регулярным - не станете же вы раз в год ровно в полночь 13 марта покупать щенка.
Все-таки станете? Вы не сатанист, часом?
Еще приятнее запланировать выполнение нерегулярного или регулярного дела так, чтобы его делал кто-то другой. Например, сообщите сыну, что вы просите его завтра в полдень отправиться в клуб собаководов и купить там щеночка. Однократно. А потом (когда купит) скажите, что вы запланировали его (сына) прогулки с ним (щеночком) ежедневно - на годы вперед.
Системный администратор, даже если у него нет сына и щеночка, тоже не
лишен радостей планирования. Так, для планирования однократных
действий в любом UNIX используется программа at, а для регулярных - crontab.
Для планирования однократного запуска задач в строго определенное
время (точность - одна минута) используется программа at. Она создает
и изменяет список задач для выполнения, размещая его в каталоге /var/spool/cron/atjobs/. В Solaris это именно такой каталог, в других
системах местоположение очереди задач может быть иным. Список задач
ежеминутно инспектируется демоном cron, который отвечает за
своевременный запуск задач. Во многих других системах UNIX демон cron
не отвечает за задания, запланированные с помощью at, а для последних
имеется специальный демон-запускатель - atd.
Чтобы at могла верно запланировать задачи, следует указать ей время и
дату запуска задачи:
at time date
Параметр time может быть задан в форме HH:MM (часы:минуты), или
словом midnight, noon, now, или временем с суффиксом AM или PM в
североамериканском формате. Дата должна быть либо в формате название_месяца день [год], либо MMDDYY, либо MM/DD/YY, либо DD.MM.YY. Также можно указать время в виде now+ n единицы, где
единицы - это minutes, hours, days, weeks. Можно указать для времени
суффикс today или tomorrow.
Указание time без date означает выполнение задачи в текущие сутки, а
если time сегодня уже прошло, - назавтра в указанное время.
Программа at принимает список задач для выполнения во входной поток.
at -l (или atq ) распечатывает список поставленных в очередь задач.
at -r позволяет удалить задачу по идентификатору, который показывает at -l.
В некоторых системах at -r называется atrm. В Solaris приемлемы оба
варианта.
Суперпользователь всегда может воспользоваться at.
Обычному пользователю разрешается использовать at в случае, если его
имя указано в файле /usr/lib/cron/at.allow. Если этого файла нет, то
проверяется, нет ли имени пользователя в /usr/lib/cron/at.deny (если
есть, ему запрещается использование at ). Если ни одного из этих двух
файлов нет, пользоваться at разрешается только пользователям, которым
назначена роль solaris.jobs.user (по умолчанию - root ). Если есть
только файл /usr/lib/cron/at.deny и он пуст, то по умолчанию всем
разрешено пользоваться at. В файлах at.deny и at.allow имена
пользователей пишутся по одному в строке.
Задания at и crontab заблокированного пользователя не запускаются -
демон cron запустит задания только того пользователя, который имеет
легальный доступ в систему в настоящее время, как отражено в файле /etc/shadow.
Задание, запущенное на выполнение демоном cron, выполняется от имени
пользователя, который поставил задание в очередь. Стандартный вывод и
стандартный поток ошибок задания cron высылает почтой этому
пользователю. Можно указать иное место для вывода информации с
помощью ключа m команды at или с помощью параметра в файле crontab
(см. ниже). Запланированные задачи выполняются в среде командного
процессора /bin/sh без назначения
Проведем небольшой эксперимент. Вначале убедимся, что каталог, где
сохраняются задания at, пуст:
#ls /var/spool/cron/atjobs/ #
Проверим время и дату:
date Сбт 15 Май 2004 19:10:29
Запланируем создание файла в корневом каталоге через две минуты:
at 1912 at> touch /tuition at> <Ctrl-D> commands will be executed using /sbin/sh job 1084633920.a at Сбт Май 15 19:12:00 2004
В каталоге, где собираются задания в очереди на выполнение, появился новый файл:
ls /var/spool/cron/atjobs/ 1084633920.a
И по команде at -l мы получаем информацию о поставленном в очередь
задании (указывается имя пользователя, инициировавшего задание,
идентификатор задания, по которому его можно удалить, и время
планируемого запуска):
at -l user = root 1084633920.a Сбт Май 15 19:12:00 2004
Пока в корневом каталоге файла tuition нет:
ls / bin devices lib opt tmp xfn boot etc lost+found platform TT_DB cdrom export mnt proc usr core home net sbin var dev kernel nsmail test vol
Почему? Да время еще не наступило:
date Сбт 15 Май 2004 19:11:42
Дожидаемся заданного времени и (о чудо!) файл /tuition появился! Смотрите:
date Сбт 15 Май 2004 19:12:12 ls / bin devices lib opt tmp vol boot etc lost+found platform TT_DB xfn cdrom export mnt proc tuition core home net sbin usr dev kernel nsmail test var
Демон cron ежеминутно инспектирует таблицу запланированных задач и
выполняет те задачи, время которых наступило (в Solaris - не более
100 задач в минуту). Программа at нужна, как видно из раздела "at"
выше, для планирования однократных задач, а программа crontab служит
для планирования периодически запускаемых cron.
У каждого пользователя есть своя таблица crontab. Ее можно
отредактировать командой crontab -e. По этой команде вызывается
текстовый редактор (обычно - vi ), а в качестве файла для
редактирования окажется таблица crontab. Если вы раньше не задавали
никаких периодических задач, файл будет пустым.
Формат таблицы crontab: каждая строка описывает одну задачу, в строке
содержится шесть полей:
mm hh dd mo dw command
mm - минуты от 0 до 59;
hh - часы от 0 до 23;
dd - числа от 1 до 31;
mo - месяцы от 1 до 12;
dw - дни недели от 0 до 7, 0 и 7 - это воскресенье;
command - команда командному процессору, которую надо запустить (возможно, с аргументами).
Каждое числовое поле в таблице может содержать число, несколько чисел через запятую, диапазон (начало и конец диапазона через дефис) или звездочку. Звездочка в соответствующем поле означает "каждую единицу времени", например в поле часов она означает "каждый час".
Если в строке указаны определенное число месяца и определенный день недели, то для выполнения команды достаточно, чтобы наступило либо это число, либо этот день недели.
Так, строка
12 10 * * 0 rm -rf /var/log/*.[0-9]
означает, что в 10:12 каждое воскресенье нужно удалять файлы *.[0-9] из /var/log.
Однако, если было бы написано
12 10 10 * 0 rm -rf /var/log/*.[0-9]
то требовалось бы выполнять такое удаление "в 10:12 по воскресеньям и десятым числам", а не "в 10:12 десятого числа, если оно приходится на воскресенье".
Как и в случае с at, команда запускается от имени владельца таблицы,
в качестве командного процессора используется /bin/sh.
В первых строках таблицы могут быть установлены переменные PATH:
PATH=/usr/bin:/usr/sbin:/usr/local/bin
В ней можно задать каталоги, которые по умолчанию не входят в PATH.
Кроме PATH можно установить переменные SHELL и HOME, а также MAILTO.
По умолчанию HOME (домашний каталог) берется из /etc/passwd.
Переменная LOGNAME устанавливается автоматически при запуске команды.
Ей присваивается имя пользователя, от имени которого запускается
команда. В BSD-системах она может называться USER, в Solaris есть обе
переменные. LOGNAME и USER нельзя переопределить, HOME и SHELL -
можно. Программа cron отправит сообщение владельцу таблицы crontab,
если найдет повод это сделать (например, произошла ошибка выполнения
команды). Если переменная MAILTO существует и ее значение отлично от
пустой строки, то cron расценит это значение как имя адресата,
которому надо послать письмо вместо пользователя, запланировавшего
задачу. Если значение переменной MAILTO - пустая строка, то почта
послана не будет. Установка любой переменной crontab осуществляется так:
имя_переменной = значение
пробелы вокруг знака равенства необязательны, а пробелы после значения будут трактоваться как часть значения. Поэтому значение лучше заключать в апострофы или кавычки для явного указания пробелов в начале и конце значения.
Для просмотра таблицы crontab используйте команду crontab -l, для
удаления таблицы - crontab -r. Можно создать файл с таблицей crontab
заранее и установить ее в систему командой
crontab имя_файла_таблицы.
Такая команда потенциально опасна: если раньше существовали
какие-либо команды в таблице crontab, то они потеряются навсегда.
В Solaris нет стандартно принятых по умолчанию регулярно выполняемых
скриптов. Однако рекомендуется их создать и расположить в каталоге /var/admin/cron/ или /etc/periodic/.
crontab -e 22 * * * * /var/admin/cron/hourly 22 22 * * * /var/admin/cron/daily 2 22 * * 0 /var/admin/cron/weekly 2 2 1 * * /var/admin/cron/monthly
В скрипт hourly рекомендуется включать проверку состояния сетевого
подсоединения ( ping ), проверку и при необходимости установку прав
доступа к почтовым ящикам пользователей, проверку состояния основных
демонов ( syslog, sendmail, named, sshd ) с помощью ps, архивацию и
обновление файлов протоколов ( log rotation ), которые достаточно
выросли за час (рекомендуемый размер файла протокола для архивации -
1-2 мегабайта, но вы можете выбрать иное, исходя из удобства
последующего анализа этого файла).
В скрипт daily включают проверку очереди сообщений (не слишком ли
велика - запустите mailq ), синхронизацию системного времени ( ntpdate, rdate ).
В скрипт weekly включают проверку свободного места на диске (если у
вас это приходится делать чаще, чем раз в неделю, имеет смысл
подумать о покупке нового диска, а может быть, и двух сразу),
проверку файлов passwd, shadow, hosts.allow и hosts.deny, файлов
конфигурации ftpd, sendmail, протоколов utmp и wtmp на предмет прав
доступа и размера.
Ежемесячный скрипт monthly обычно содержит архивацию и обновление тех
файлов протоколов, которые растут медленно.
Вы можете включить в эти скрипты свои задачи, которые являются
специфическими для конкретной системы - проверку конфигурации smbd
для файлового сервера samba, проверку дисковых квот пользователей,
контроль появления свежих файлов с установленным битом SUID и так
далее.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.