Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

Shell / Hints

В каталоге /var/run можно найти группу файлов с расширением .pid , которые представляют из себя метки запущенных демонов . Если вы выходите в интернет с помощью модема , то у вас в этом каталоге образуется файл с названием типа /var/run/ppp0.pid (у меня на аспе это файл pppwatch-ppp0.pid). В них хранится id-шник процесса . Можно написать скрипт , который будет проверять состояние вашего модемного коннекта :
     HOST=192.168.55.253               # адрес вашего гейта
     SLEEP=1m                          # интервал пингования
     if [ -e "/var/run/ppp0.pid" ]; then  # проверка
         echo "  * * *    PPP-UP is running   * * *  "
     else
         echo "    * * *      PPP0 interface is not up!  * * *    "
         exit
     fi
     while [ -e "/var/run/ppp0.pid" ]
     do                                  # пингуем раз в минуту
       ping -c 1 $HOST > /dev/null
       sleep $SLEEP
     done
Когда вы запускаете bash , во время инициализации он читает настройки из группы файлов :
     * /etc/profile
     * ~/.bash_profile
     * ~/.bashrc
В них можно прописать свои персональные настройки с помощью алиасов . Синтаксис команды
 	alias shortcut=`command -options`
Алиасы облегчают нашу жизнь . Например , следующую группу алиасов можно прописать в файле /root/bashrc
 	alias c='clear'
 	alias d='ls -lF'
 	alias dir='ls -lF'
 	alias ftp='ftp -v'
 	alias lpr='lpr -h'
 	alias rm='rm -i'
 	alias startx='startx >& /dev/null'
 	alias x='startx >& /dev/null'
Вместо длинной команды 'clear' теперь можно набрать просто с . В файле /root/bashrc можно прописывать свои собственные функции и запускать их по имени , например :
 	hello()
 	{
 		echo "Всем привет из bashrc"
 	}
Затем , запустив в командной строке просто hello , мы получим приветствие .

Для анализа изменения настроек системы полезно завести отдельный каталог - назовем его
 /root/config_dist -
и скопировать туда основные конфигурационные файлы , такие например , как
     * /etc/inittab
     * /etc/profile
     * /etc/rc.d/rc.*
     * /etc/passwd
     * /usr/X11R6/lib/X11/XF86Config
откуда их всегда можно будет восстановить в случае краха системы . Затем можно сделать симлинки на другой каталог - /root/links , после чего все наиболее важные конфигурационные файлы можно будет править в одном месте - в каталоге /root/links.

Полезные вещи , которые можно прописать в кронтабе и которые пришли из RH2.1
 # обнуление wtmp
 45 02 * * * root find /var/log/wtmp -size +32k -exec cp /dev/null {} \;
 # удаление /var/tmp залежавшихся файлов (10 дней)
 43 02 * * * root find /var/tmp/* -atime +3 -exec rm -f {} \; 2> /dev/null
Для того , чтобы заставить крон выполнять каждые 5 минут какую-то задачу , например проверку почты , можно прописать :
 	0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/local/bin/checkmail
 Следующая команда будет раз в начале месяца удалять устаревшие файлы из /tmp :
 	0 1 1 * * find /tmp -atime 3 -exec rm -f {} \;
Следующая команда выполняет обновление базы данных файлов (запускать ее лучше ночью ):
 	41 5 * * *  updatedb --prunepaths="/tmp /var /proc /cdrom" > /dev/null 2>&1


strace - системная утилита , которая отслеживает системные вызовы . Например , запустив команду strace /bin/bash , мы сможем отследить , какие системные вызовы происходят при загрузке bash . Запустив ее с параметром -o
                strace -o log /bin/bash  
получим вывод в файл . Вот , например , первые строки этого лога на моей машине :
 	execve("/bin/bash", ["/bin/bash"], [/* 35 vars */]) = 0
 	uname({sys="Linux", node="localhost.localdomain", ...}) = 0
 	brk(0)                                  = 0x900e000
 	open("/etc/ld.so.cache", O_RDONLY)      = 4
 	fstat64(4, {st_mode=S_IFREG|0644, st_size=62802, ...}) = 0
 	old_mmap(NULL, 62802, PROT_READ, MAP_PRIVATE, 4, 0) = 0xbf550000
 	close(4)                                = 0
 	open("/lib/libtermcap.so.2", O_RDONLY)  = 4
 	...
Если вы хотите посмотреть сообщения , которые появляются при загрузке . наберите
 	dmesg
Для вывода содержимого каталога можно использовать следующую конструкцию :
      if [ $# = 1 ]
      then
      {
         for i in `find . -path './dev' -prune -o -print 2> /dev/null`
         do
         {
             fgrep -i $1 $i > /dev/null 2>&1;
             if [ $? = 0 ]
             then
             {
                 echo $i
             }
             fi;
        } done;
     }
     else    {        echo "В качестве аргумента наберите хотя бы ./"    }
     fi;
 Обратите здесь внимание на строку
     find . -path './dev' -prune -o -print 2> /dev/null
Здесь мы заранее исключаем возможность сканирования каталога /dev . Возможные проблемы мы выводим в /dev/null. Обратите также внимание на одинарные кавычки,в которые поставлена команда find - это сделано для корректного вывода в цикле for . Функция fgrep , которая должна искать регулярное выражение , в данном случае находит непустое значение файла и распечатывает его .

Пример: Предположим , что нам нужно пользователю после залогинивания прописать дополнительные настройки . Для этого можно использовать файл /etc/profile . Например , руту прописать umask=022 , а всем остальным пользователям 077 :
 	USER_WHOAMI=`whoami`
 	case "$USER_WHOAMI" in
 		"root") umask 022;;
 		     *) umask 077;;
 	esac 
Пример: Нужно составить список динамических библиотек , которые прилинкованы к программе :
 	ldd /usr/local/bin/program_name
Теперь напишем скрипт для всех программ , лежащих в данном каталоге :
 	find /usr/local/bin/* -print |
 	while read FILE; do
 		echo $file
 		echo
 		ldd $file
 		echo
 	done
Если вы хотите , чтобы в консоли не было скроллинга , нужно использовать префикс :
 echo -n "Эта строка будет выведена на экран без скроллинга ..."
Если вы хотите вернуться в предыдущий каталог , наберите :
 	cd ~-  или   cd -
Как обнулить файл /var/log/messages:
 	 cp /var/adm/messages /var/log/messages.prev
 	 cp /dev/null /var/log/messages  

Строковые шаблоны

Есть 2 типа шаблонов - правые и левые . Для их задания используются идентификаторы :
    # - решетка(слева)  
    % - процент (справа) 
 Пример:
 
Operator Function Example
${foo#t*is} удаляет все , что слева от шаблона export $foo="this is a test"
echo ${foo#t*is}
is a test
${foo##t*is} удаляет все , что слева от шаблона , включая шаблон export $foo="this is a test"
echo ${foo#t*is}
a test
${foo%t*st} удаляет все,что справа от шаблона export $foo="this is a test"
echo ${foo%t*st}
this is a
${foo%%t*st} удаляет все,что справа от шаблона, включая шаблон export $foo="this is a test"
echo ${foo#t*is}
 

Замена

В баше имеются 4 оператора инициализации переменных :
 
Operator Function Example
${foo:-bar} Если $foo существует и не нуль, возвращает $foo. Если не существует,или нуль, возвращает bar. export foo=""
echo ${foo:-one}
one
echo $foo
 
${foo:=bar} Если $foo существует и не нуль, возвращает $foo. Если не существует, или нуль, устанавливает $foo = bar , и возвращает bar export foo=""
echo ${foo:=one}
one
echo $foo
one
${foo:+bar} Если $foo существует и не нуль, возвращает bar. Если не существует, или нуль, возвращает null. export foo="this is a test"
echo ${foo:+bar}
bar
${foo:?"error message"} Если $foo существует и не нуль, возвращает его значение. Если не существует, или нуль, печатает ошибку. Если нечего печатать, печатает parameter null or not set.
Note:
export foo="one"
for i in foo bar baz; do
eval echo \${$foo:?}
one
bash: bar: parameter null or not set
bash: baz: parameter null or not set
 

Debug

Для отладки скрипта можно использовать опцию -nv. При этом запускаемый скрипт будет читаться и распечатываться , но не исполняться , и возможно выявление ошибок :
 	#!/bin/bash -nv 
Следующая функция является аналогом си-шной getch() - возникает пауза до тех пор , пока не будет нажата клавиша :
 	getch ()     # gets one char from kbd, no "Enter" necessary
 	{
 	    OLD_STTY=`stty -g`
 	    stty cbreak -echo
 	    GETCH=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
 	    stty $OLD_STTY
 	} 
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье