Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
tape device [rmt0]
Можно выбрать rmt1 и rmt3
mail admin when the backup has finished [yes]
Нет вариантов выбора
type of backup [full]
Можно выбрать опцию
normal или sybase
Изменения настроек выполняются с помощью временных переменных. Для получения доступа к заданным по умолчанию настройкам установите курсор мыши в любом поле и нажмите клавишу [Return]. Однако следующие настройки изменять нельзя:
backup log filename code name.
Все внесенные изменения затем подтверждаются. После завершения процесса подтверждения значения временных переменных снова присваиваются исходным переменным. До завершения резервного копирования выполняется тестирование магнитной ленты. В процессе резервного копирования применяются команды find и cpio. С помощью этих команд используются переменные из файла настроек или значения новых переменных, указанные пользователем.
Далее приводится соответствующий сценарий.
$ pg backup_run
#!/bin/sh
#backup_run
#сценарий выполнения резервного копирования
#загрузка файла с конфигурационными параметрами
SOURCE=/appdva/bin/backup.defaults
check_source ()
{
#check_source
#файл backup.defaults содержит параметры конфигурации/функции
#проверка того, что путь содержит нужный каталог
if [ -r $SOURCE ]; then
. $SOURCE
else
echo "`basename $0`: cannot locate defaults file"
exit 1
fi
}
header () {
# header
USER=`whoami`
MYDATE=`date + %A" "%e" of "%B-%Y`
clear
cat << MAYDAY
User : $USER $MYDATE
NETWORK SYSTEM BACKUP
MAYDAY
}
change_settings () {
# change_settings
# отображение параметров, заданных по умолчанию
header
echo "Valid Entries Are…"
echo "Tape Device: rmt0, rmt1, rmt3"
echo "Mail Admin: yes, no"
echo "Backup Type: full, normal, sybase "
while :
do
echo -n -c "nn Tape Device To Be Used For This Backup [$_DEVICE] :"
read T_DEVICE
: ${T_DEVICE:=$_DEVICE}
case $T_DEVICE in
rmt0|rmt1|rmt3) break;;
*) echo "The devices are either… rmt0, rmt1, rmt3"
esac
done
#если пользователь нажимает клавишу ввода при установке курсора в любом
#из полей, применяются настройки, заданные по умолчанию
while :
do
echo -n "Mail Admin When Done [$INFORM] :"
read T_INFORM
: ${T_INFORM:=$_INFORM}
case $T_INFORM in
yes|Yes) break;;
no|No) break;;
*) echo "The choices are yes, no";;
esac
done
while :
do
echo -n " Backup Type [$_TYPE] :"
read T_TYPE
: ${T_TYPE:=$_TYPE}
case $T_TYPE in
Full|full) breaks;;
Normal|normal)break;;
Sybase|sybase)break;;
*) echo "The choices are either… full, normal, sybase";;
esac
done
#повторное присваивание значений временных переменных исходным переменным,
#которые были загружены
_DEVICE=$T_DEVICE;
_INFORM=$T_INFORM;
_INFORM=$T_INFORM
}
show_settings ()
# отображение текущих настроек
{
cat << MAYDAY
Default Settings Are…
Tape Device To Be Used : $_DEVICE
Mail Admin When Done : $_INFORM
Type Of Backup : $_TYPE
Log file of backup : $_LOGFILE
MAYDAY
}
get_code ()
{
#пользователи имеют 3 попытки для ввода правильного кода
#_CODE загружается из исходного файла
clear
header
_COUNTER=0
echo "YOU MUST ENTER THE CORRECT CODE TO BE ABLE TO CHANGE DEFAULT SETTINGS"
while :
do
_COUNTER=`expr $_COUNTER + 1`
echo -n "Enter the code to change the settings:"
read T_CODE
# echo $_COUNTER
if [ "$T_CODE"="$_CODE" ]; then
return 0
else
if [ "$_COUNTER" -gt 3 ]; then
echo "Sorry incorrect code entered, you cannot change the settings.." return 1
fi
fi
done
}
check_drivef() {
# перемотка ленты
mt -f /dev/$_DEVICE rewind > /dev/null 2>&1
if [ $? -ne 0 ]; then
return 1 else
return 0
fi
)
#========== main ==============
# чтение файла с параметрами
check_source
header
#отображение содержимого переменных show_settings
#уточнение у пользователя, желает ли он изменить настройки
if continue_prompt "Do you wish To Change Some Of The System Defaults" "Y"; then
# да, тогда введите имя
if get_code; then
# изменение параметров change_settings fi fi
# параметры получены, резервное копирование
if check_drive; then
echo "tape OK…."
else
echo "Cannot rewind the tape..is it in the tape drive ???"
echo "Check it out"
exit 1
fi
# что копировать
case $_TYPE in
Full|full)
BACKUP_PATH="sybase syb/support etc var bin apps use/local";;
Normal|normal)
BACKUP_PATH="etc var bin apps usr/local";;
Sybase|sybase)
BACKUP_PATH="Sybase syb/support";;
esac
# резервное копирование
cd /
echo "Now starting backup "
find $BACKUP_PATH -print | cpio -ovB -O /dev/$_DEVICE >> $_LOGFILE 2>&1
#если приведенная выше команда cpio не выполняется в системе,
#воспользуйтесь командой cpio, приведенной ниже
#find $BACKUP_PATH -print [ cpio -ovB > /dev/$_DEVICE >> $_LOGFILE 2>&1
#для получения дополнительной информации измените -ovB на -ovcC66536
if [ "$_INFORM"="yes" ]; then
echo "Backup finished check the log file" | mail admin fi
Файл backup.defaults содержит заданные по умолчанию настройки наряду с функцией continue_prompt. Ниже приводится содержимое файла.
$ pg backup.defaults
#!/bin/sh
#backup.defaults
#файл конфигурации, заданный по умолчанию, для сетевых резервных копий
#редактируете его на свой страх и риск!!
#
_CODE="comet"
_LOGFILE="/appdva/backup/log.`date +%y%m%d`"
_DEVICE="rmt0"
_INFORM="yes"
_TYPE="Full"
continue_prompt ()
#continue_prompt
#для вызова: continue_prompt "отображаемая строка"
default_answer ()
{
_STR=$1
_DEFAULT=$2
# проверка ввода корректных параметров
if [ $# -lt 1 ]; then
echo "continue_prompt: I need a string to display"
return 1
fi
while : do
echo -n "$_STR [Y.. N] [$_DEFAULT]:"
read _ANS
: ${_ANS:=$_DEFAULT]
if [ "$_ANS" = "" ]; then
case $_ANS in
Y) return 0 ;;
N) return 1 ;;
esac
fi # пользователь сделал выбор
case $_ANS in
y|Y|Yes|YES) return 0;;
n|N|No|NO) return 1;;
*) echo "Answer either Y or N, default is $_DEFAULT";;
esac
echo $_ANS
done
}
Ниже приводится поток вывода при отображении настроек, заданных по умолчанию, причем пользователя запрашивают, желает ли он изменить эти настройки:
Следующий поток вывода иллюстрирует процесс изменения значения для настроек, заданных по умолчанию. Здесь изменился тип резервного копирования, и когда сценарий проверяет ленточный накопитель, он обнаруживает определенные проблемы. Сценарий завершает работу с помощью кода завершения последней команды.