Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Languages
 С
 GNU С Library 
 Qt 
 STL 
 Threads 
 C++ 
 Samples 
 stanford.edu 
 ANSI C
 Libs
 LD
 Socket
 Pusher
 Pipes
 Encryption
 Plugin
 Inter-Process
 Errors
 Deep C Secrets
 C + UNIX
 Linked Lists / Trees
 Asm
 Perl
 Python
 Shell
 Erlang
 Go
 Rust
 Алгоритмы
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...5175 
 Trees...951 
 Максвелл 3...877 
 Go Web ...832 
 William Gropp...816 
 Ethreal 3...793 
 Gary V.Vaughan-> Libtool...782 
 Ethreal 4...776 
 Rodriguez 6...772 
 Ext4 FS...766 
 Clickhouse...765 
 Steve Pate 1...762 
 Ethreal 1...748 
 Secure Programming for Li...737 
 C++ Patterns 3...724 
 Ulrich Drepper...707 
 Assembler...699 
 DevFS...670 
 Стивенс 9...657 
 MySQL & PosgreSQL...639 
 
  01.01.2024 : 3621733 посещений 

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
 	} 
Оставьте свой комментарий !

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

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