Полезные приемы при работе в ОС Solaris
Автор : Евгений Воронянский / Дата : 2005-09-03 12:41
Добавить или посмотреть комментарии :
(2)
Рейтинг пользователей :
7.00
Автор : Евгений Воронянский / Дата : 2005-09-03 12:41
Добавить или посмотреть комментарии :
Рейтинг пользователей :
7.00
Отмечу, что все нижеприведенные мелочи Вы можете использовать в том случае, если используете командный интерпритатор - bash.
Мониторинг работы процессов
При выполнении длительных операций приходится следить за окончанием процесса. Для этого можно в коменде запуска процесса через ";" указать :
или если это не воможно, то использовать следующее:
где PID_PROCESS необходимо заменить на PID интересующего процесса. По окончании процсса в почту текущего пользователя будет приходить напоминание о завершении процесса каждые пять минут.
Если Вы часто используете "длительные процесссы", то целесообразно создать удобный скрипт:
#!/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 платформе)
Для определения количества пямяти используемой процессом можно использовать команду
Замечание: при наличии Shared Memory необходимо из первого столбца вычесть размер Shared Memory.
При первоначальной настройке операционной системы Вам нужно остановить лишние демоны. С помощью скрипта приведенного ниже достаточно просто сопоставить прослушиваемый порт - PID процесса
#!/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
При частом добавлении/удалении пользоватеей возникает необходимость управления группами. Удалить пользователя из группы:
#!/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
При выводе строк текстового файла иногда необходимо получить только уникальные значения. Для этого можно использовать следующую конструкцию (тем кто не ищет легких путей):
для того кто торопится:
Достаточно часто необходимо знать общую скорость записи на диск или чтения с диска:
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
)
Для файловой системы
Поиск мертвый символических ссылок:
Полезное в /etc/profile
Для того чтобы знать под каким именем и от какого пльзователя производятся действия добавьте:
после этого командная строка пинимает вид:
Для того чтобы автоматически экспортировать дисплей на компьютер с которого было установлено соединение посредством SSH добавьте:
Внимание!
В зависимости от версии sshd эта срока может иметь несколько другой вид, но думаю смысл понятен.
Или другой пример реализации:
Полезное в crontab
По умолчанию почовый демон (sendmail) по разным причинам накапливает "устаревшую" почту в очереди, поэтому добавляем в crontab пользователя от которого работает демон:
При длительной работе ОС и частых "логинах" пользователей сильно разрастается файл wtmpx, поэтому его стоит периодически очищать, так как наврядли Вам пригодится инфорация годичной давности..
Если у Вас установлен "Sar", то вот так просто можно получить статистику по загрузке за прошедший день:
Механизм защиты от повторного запуска скрипта (к примеру который запускается по cron)
LOCK=/tmp/$0.lock
[ -e "$LOCK" ] && exit -1
touch $LOCK
.... Тут полезные действия без exit
rm -f $LOCK
Пользователю oracle
При использовании большого числа серверов и БД достаточно часто может происходить путаница. Если добавить следующее в профиль пользователя oracle, то ее вероятность сводится к минимуму.
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_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 arcl='tail -1000 $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log'
Перед передачей БД в отдел разработки или при внедрении БД в эксплуатацию полезно выполнить следующее:
1.Создать пользователя для администрирования БД
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_$SESSION TO CONNECT;
4. На production теоретически разработки быть не должно, но как показывает практика такое встречается и достаточно часто... поэтому отлавливаем изменения.
Все изменения будут находиться в
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))
А фиксировать их будет
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. Полезно фиксировать момент подключения пользователя:
(
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-файла
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');
Мониторинг работы процессов
При выполнении длительных операций приходится следить за окончанием процесса. Для этого можно в коменде запуска процесса через ";" указать :
Код:
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/bashecho 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/bashLOCK=/tmp/$0.lock
[ -e "$LOCK" ] && exit -1
touch $LOCK
.... Тут полезные действия без exit
rm -f $LOCK
Пользователю oracle
При использовании большого числа серверов и БД достаточно часто может происходить путаница. Если добавить следующее в профиль пользователя oracle, то ее вероятность сводится к минимуму.
Код:
tput clearecho '********************************************************************************'
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}'`; doneORACLE_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/passCREATE 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_changesAFTER 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' filenameFROM 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
Последний раз обновлено 09.01.2009
Комментарии :
super !!! spasibo ...!!! davaite eshio umnyh scriptikov!
Триггер audit_ddl_changes можно дополнить записью в alert.log, тогда средства мониторинга этого файла, если они используются, смогут более оперативно извещать об изменениях:
Код SQL:
CREATE OR REPLACE TRIGGER audit_ddl_changesAFTER 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;
