Полезные приемы при работе в ОС Solaris
Автор : Евгений Воронянский / Дата : 2005-09-03 12:41
Добавить или посмотреть комментарии : (2)
Рейтинг пользователей : 7.00
Отмечу, что все нижеприведенные мелочи Вы можете использовать в том случае, если используете командный интерпритатор - bash.



Мониторинг работы процессов

При выполнении длительных операций приходится следить за окончанием процесса. Для этого можно в коменде запуска процесса через ";" указать :
Код:
oracle@host$ long_process.sh;echo "End process" |mail $USER

или если это не воможно, то использовать следующее:
Код:
oracle@host$while true;do ps -ef |grep PID_PROCESS|grep -v grep|if read str; then sleep 1; else echo "End process"|mail $USER;sleep 600; fi;done;

где PID_PROCESS необходимо заменить на PID интересующего процесса. По окончании процсса в почту текущего пользователя будет приходить напоминание о завершении процесса каждые пять минут.
Если Вы часто используете "длительные процесссы", то целесообразно создать удобный скрипт:
Код:
root@host>cat waitprocess
#!/bin/bash
usage()
{
echo Usage: waitprocess proc_name email messages;
}

if [ -z "$1" ]||[ -z "$2" ]||[ -z "$3" ]; then
usage;
exit -1;
fi

while true; do
 sleep 1;
 str=`ps -ef |grep "$1"|grep -v grep|grep -v "waitprocess"|tail -1`;
 [ -z "$str" ] && break 1;
done;
echo "$3"|mail $2

Для того чтобы определить объем оперативной памяти и количество процессоров в сисеме используйте (на SPARC платформе)
Код:
prtdiag |egrep "US|Memory size"

Для определения количества пямяти используемой процессом можно использовать команду
Код:
16:29|root@host>ps -A -o vsz,pcpu,pid,comm|sort -n

Замечание: при наличии Shared Memory необходимо из первого столбца вычесть размер Shared Memory.

При первоначальной настройке операционной системы Вам нужно остановить лишние демоны. С помощью скрипта приведенного ниже достаточно просто сопоставить прослушиваемый порт - PID процесса
Код:
16:29|root@host>cat pp
#!/bin/bash
#
# For Solaris 8
#
PROCS=`/usr/bin/ps -ef|awk 'NR>1{print $2}'`
for i in $PROCS
do
  if [ -n "`/usr/bin/pfiles $i 2>/dev/null|grep S_IFSOCK`" ]
  then
      /usr/bin/ps -f -p $i|/usr/bin/awk 'NR>1{print}'
      /usr/bin/pfiles $i 2>/dev/null|/usr/bin/awk '/S_IFSOCK/{print $1, $2, $5}/sockname:/{print}'
  fi
done


При частом добавлении/удалении пользоватеей возникает необходимость управления группами. Удалить пользователя из группы:
Код:
#cat `which rm_ug`
#!/bin/sh
[ -z $2 ] && echo Usage rm_ug user group && exit 0
cat /etc/group |grep -v $2 >/etc/group.b
cat /etc/group |grep $2 |sed "s/$1//g"|sed 's/::/:/g'>>/etc/group.b
mv /etc/group.b /etc/group


При выводе строк текстового файла иногда необходимо получить только уникальные значения. Для этого можно использовать следующую конструкцию (тем кто не ищет легких путей):
Код:
cat filename|sort|while read d; do [ "$TSTR" != "$d" ] && echo $d; export TSTR=$d; done; unset TSTR

для того кто торопится:
Код:
cat filename|sort -u


Достаточно часто необходимо знать общую скорость записи на диск или чтения с диска:
Код:
#!/bin/bash
echo Match mistake from iostat -xnz 1 1
iostat -xnz 1 1|egrep -v "extended|wait"|
(while read d1 d2  d3 d4 d5 ;
do
MW=$d4+$MW;
MR=$d3+$MR;
done
MR=`echo $MR 0|bc`
MW=`echo $MW 0|bc`
echo "Mistake read:$MW k/s; write: $MW k/s"
while true; do
iostat -xnz 2 2|egrep -v "extended|wait"|
(while read d1 d2  d3 d4 d5 ;
do
StrW=$d4+$StrW;
StrR=$d3+$StrR;
done
echo $StrW|sed s/+$/-$MW/
echo $StrR|sed s/+$/-$MR/)|
bc|(while read d; do
Str=$Str" "$d;
done
echo $Str)|awk '{print "Read "$2" k/s| Write "$1" k/s" }'|
(read IO && date|(read dat && echo $IO"|" $dat));
done
)


Для файловой системы
Поиск мертвый символических ссылок:
Код:
find / -type l -print | perl -nle '-e || print'|while read d; do ls -la $d; done


Полезное в /etc/profile

Для того чтобы знать под каким именем и от какого пльзователя производятся действия добавьте:
Код:
export PS1=$'[33]0733[32m]`date +%H:%M`|u@h:$'

после этого командная строка пинимает вид:
Код:
15:32|oracle@host>


Для того чтобы автоматически экспортировать дисплей на компьютер с которого было установлено соединение посредством SSH добавьте:
Код:
DISPLAY=`env|grep SSH_CONNECTION|awk '{print $1}'|sed 's/SSH_CONNECTION=//g'|awk '{print {PAGE_TEXT}":0.0"}'`; export DISPLAY

Внимание!
В зависимости от версии sshd эта срока может иметь несколько другой вид, но думаю смысл понятен.
Или другой пример реализации:
Код:
DISPLAY=`/usr/xpg4/bin/who am i|awk '{print $6":0.0"}'|sed 's/(//g'|sed 's/)//g'`; export DISPLAY


Полезное в crontab

По умолчанию почовый демон (sendmail) по разным причинам накапливает "устаревшую" почту в очереди, поэтому добавляем в crontab пользователя от которого работает демон:
Код:
0   0    * * * /usr/lib/sendmail -q


При длительной работе ОС и частых "логинах" пользователей сильно разрастается файл wtmpx, поэтому его стоит периодически очищать, так как наврядли Вам пригодится инфорация годичной давности..
Код:
59 23 31 12 * cp /dev/null /var/adm/wtmpx


Если у Вас установлен "Sar", то вот так просто можно получить статистику по загрузке за прошедший день:
Код:
59    23 * * * sar |mailx -s "SarStat" root


Механизм защиты от повторного запуска скрипта (к примеру который запускается по cron)
Код:
#!/bin/bash
LOCK=/tmp/$0.lock
[ -e "$LOCK" ] && exit -1
touch $LOCK
.... Тут полезные действия без exit
rm -f $LOCK


Пользователю oracle

При использовании большого числа серверов и БД достаточно часто может происходить путаница. Если добавить следующее в профиль пользователя oracle, то ее вероятность сводится к минимуму.
Код:
tput clear
echo '********************************************************************************'
echo ' '
cat /etc/release
echo ' Machine : ' `hostname`
echo ' User Id : ' $LOGNAME `id`
echo ' Home Directory : ' $HOME
echo ' Default ORACLE_SID : ' $ORACLE_SID
echo ' Default ORACLE_HOME : ' $ORACLE_HOME
echo ' Terminal Id : ' `tty`
echo ' '
echo ' '
echo '********************************************************************************'
echo ' '
echo ' ' `date`
echo ' '
echo '**********************************Last logins:**********************************'
last -7
echo '********************************************************************************'


При написании скриптов, которые выплняются на сервере с несколькими инстансами, часто приходится явно указывать переменные окружения Oracle такие как ORACLE_HOME, ORACLE_BASE и т.д. Как правило при работе с этим экземпляром все пременные уже выставлены, поэтому при создании скрипта можно экономить время:
Код:
oracle@host$ set |grep ORA|awk '{print $1";"}'|while read str;do echo $str `echo $str|sed 's/=/ /g'|awk '{print "export "$1}'`; done

ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/product/8.1.7-64; export ORACLE_HOME
ORACLE_PATH=/usr/ccs/bin; export ORACLE_PATH
ORACLE_SID=orcl; export ORACLE_SID
ORACLE_TERM=xsun5; export ORACLE_TERM
ORA_NLS=/u01/app/oracle/product/8.1.7-64/ocommon/nls/admin/data; export ORA_NLS
ORA_NLS32=/u01/app/oracle/product/8.1.7-64/ocommon/nls/admin/data; export ORA_NLS32
ORA_NLS33=/u01/app/oracle/product/8.1.7-64/ocommon/nls/admin/data; export ORA_NLS33


АБД часто обращаются к файлу alert_$ORACLE_SID.log, поэтому целесообразно создать алиасы после установки переменных окружения:
Код:
alias arc='tail -50 $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log'
alias arcl='tail -1000 $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log'


Перед передачей БД в отдел разработки или при внедрении БД в эксплуатацию полезно выполнить следующее:
1.Создать пользователя для администрирования БД
Код:
CREATE USER dbadmin IDENTIFIED BY pass DEFAULT TABLESPACE users;
GRANT DBA TO dbadmin WITH ADMIN OPTION;
ALTER USER dbadmin DEFAULT ROLE DBA;
ALTER USER DBADMIN QUOTA UNLIMITED ON USERS;

2. Вьюшки будут часто использоваться во всяких хранимых....
Код:
GRANT SELECT ON SYS.V_$PROCESS TO CONNECT;
GRANT SELECT ON SYS.V_$SESSION TO CONNECT;

4. На production теоретически разработки быть не должно, но как показывает практика такое встречается и достаточно часто... поэтому отлавливаем изменения.
Все изменения будут находиться в
Код:
CONNECT dbadmin/pass
CREATE TABLE dll_audit_log (
   stamp     DATE,
   username  VARCHAR2(30),
   osuser    VARCHAR2(30),
   machine   VARCHAR2(30),
   terminal  VARCHAR2(30),
   operation VARCHAR2(30),
   objtype   VARCHAR2(30),
   objname   VARCHAR2(30))

А фиксировать их будет
Код:
CREATE OR REPLACE TRIGGER audit_ddl_changes
   AFTER CREATE OR DROP OR ALTER
      ON DATABASE
BEGIN
  INSERT INTO dll_audit_log VALUES
        (SYSDATE,
         SYS_CONTEXT('USERENV', 'SESSION_USER'),
         SYS_CONTEXT('USERENV', 'OS_USER'),
         SYS_CONTEXT('USERENV', 'HOST'),
         SYS_CONTEXT('USERENV', 'TERMINAL'),
         ORA_SYSEVENT,
         ORA_DICT_OBJ_TYPE,
         ORA_DICT_OBJ_NAME
        );
END;

5. Полезно фиксировать момент подключения пользователя:
Код:
CREATE TABLE log_info
(
  USERNAME    VARCHAR2(30 BYTE),
  HOSTNAME    VARCHAR2(60 BYTE),
  IP_ADDRESS  VARCHAR2(16 BYTE),
  SID         NUMBER,
  SERIAL#     NUMBER,
  DATETIME    DATE,
  SPID        NUMBER);

CREATE TRIGGER tr_log_info
   AFTER LOGON ON DATABASE
DECLARE
   tmp_num   NUMBER  := 0;
   tmp_sid   NUMBER  := 0;
   tl        INTEGER := 1;
BEGIN
   INSERT INTO log_info
      SELECT s.username, SYS_CONTEXT ('USERENV', 'HOST'),
             SYS_CONTEXT ('USERENV', 'IP_ADDRESS'), s.SID, s.serial#,
             SYSDATE, p.spid
        FROM v$session s, v$process p
       WHERE audsid = (SELECT SYS_CONTEXT ('USERENV', 'SESSIONID')
                         FROM DUAL)
         AND s.paddr = p.addr(+);
END;


Быстро узнать имя trace-файла
Код:
SELECT p1.value||'/'||p2.value||'_ora_'||p.spid||'.trc' filename
FROM v$process p, v$session s, v$parameter p1, v$parameter p2
WHERE p1.name = 'user_dump_dest'
AND p2.name = 'db_name'
AND p.addr = s.paddr
AND s.audsid = USERENV ('SESSIONID');


Воронянский Евгений
Последний раз обновлено 09.01.2009

Комментарии :

Vlad   2006-01-19 13:35 #77  

super !!! spasibo ...!!! davaite eshio umnyh scriptikov!

Vlad   2006-12-05 14:07 #412  

Триггер audit_ddl_changes можно дополнить записью в alert.log, тогда средства мониторинга этого файла, если они используются, смогут более оперативно извещать об изменениях:

Код SQL:
CREATE OR REPLACE TRIGGER audit_ddl_changes
   AFTER CREATE OR DROP OR ALTER
      ON DATABASE
BEGIN
  INSERT INTO dll_audit_log VALUES
        (SYSDATE,
         SYS_CONTEXT('USERENV', 'SESSION_USER'),
         SYS_CONTEXT('USERENV', 'OS_USER'),
         SYS_CONTEXT('USERENV', 'HOST'),
         SYS_CONTEXT('USERENV', 'TERMINAL'),
         ORA_SYSEVENT,
         ORA_DICT_OBJ_TYPE,
         ORA_DICT_OBJ_NAME
        );
[b]sys.dbms_system.ksdwrt(2, 'DDL EVENT: '||to_char(sysdate)||' '||
                              SYS_CONTEXT('USERENV', 'SESSION_USER')||' - '||
                              ORA_SYSEVENT||' '||ORA_DICT_OBJ_TYPE|| ' '||
                              ORA_DICT_OBJ_OWNER||'.'||ORA_DICT_OBJ_NAME);[/b]
END;


© Surgutnet.ru 2005—2010
All rights reserved.
Перепечатка материалов с данного сервера возможна только с ОБЯЗАТЕЛЬНЫМ указанием АКТИВНОЙ ссылки на данный сайт
или с письменного разрешения владельцев материалов.

Расположение посетителей сайта


SQL общее время: 0.006 секунд - SQL запросов: 18 - Среднее время SQL: 0.00032 секунд
Страница создана за 0.283 секунд