Создание в домашнем каталоге подкаталога lab4, переход в него:

avrgavr@hp-avrgavr:~$ mkdir lab4

avrgavr@hp-avrgavr:~$ cd lab4/

Сохранение значений внетренних переменных shell и номеров процессов в системе в файле F1.var

avrgavr@hp-avrgavr:~/lab4$ env > F1.var

avrgavr@hp-avrgavr:~/lab4$ ps - e >> F1.var

Изменение значений переменных PS1, PS2, сохранение в файле F2.var обновленных значений:

avrgavr@hp-avrgavr:~$ PS1="->"

avrgavr@hp-avrgavr:~$ PS2="-->"

Данные значения необходимо занести в ~/.bashrc (/etc/profile) либо произвести export.

avrgavr@hp-avrgavr:~/lab4$ env > F2.var

Возврат к предыдущим значениям переменных:

avrgavr@hp-avrgavr:~$ cp /etc/skel/.profile /home/avrgavr/.profile

6. Скопировать /etc/skel/.profile в директорию lab4, определить переменные DIGIT_FOR_LAB, MYOWNNAME, TIMEZONE, MYGROUP, DAY_OF_WEEK_TODAY, PATH, HOME

avrgavr@hp-avrgavr:~$ cp /etc/skel/.profile /home/avrgavr/lab4/

avrgavr@hp-avrgavr:~$ cp./.bashrc /home/avrgavr/lab4/

avrgavr@hp-avrgavr:~$ bash --init-file /home/avrgavr/lab4/.bashrc

Программа, которая по вводимой произвольной последовательности чисел осуществляет вычисление суммы и выводит конечный результат на экран и в файл sh. result. Используется значение переменной интерпретатора $#.

user1@hp-avrgavr:~$ cat script

#!/bin/bash

if [ $# == 0 ]

then

echo No arguments are specified!

else

SUM=0

for value in $*

do

let SUM=SUM+$value

done

echo Sum value is SUM=$SUM

НЕ нашли? Не то? Что вы ищете?

echo SUM=$SUM>sh. result

fi

user1@hp-avrgavr:~$ ./script

Sum value is SUM=31

user1@hp-avrgavr:~$ cat sh. result

SUM=31

Скрипт, который каждые две минуты выдает на экран сообщение, если наступило определенное время в определенный день. Режим запуска — фоновый. После каждого вывода на экран переменной MYOWNNAME удлинняется на один символ из последовательности «A» «B» «C» «D»...

P. S.: Для ускорения проверки работоспособности скрипта было изменено задание: удлиннение переменной и вывод измененного значения на экран производится в определенное время с точностью до минуты каждые 20 секунд.

user1@hp-avrgavr:~$ cat script1

#!/bin/bash

if [ $# != 3 ]

then

echo No arguments specified!

exit

fi

MYMINUTE=$3

MYHOUR=$2

MYDAY=$1

MYOWNNAME="To be continued... "

while true

do

{

for i in "A " "B " "C " "D " "E " "F " "G "

do

sleep 20s

DAY=`date +%d`

HOUR=`date +%H`

MINUTE=`date +%M`

if [ $DAY -eq $MYDAY ]

then

if [ $HOUR -eq $MYHOUR ]

then

if [ $MINUTE - eq $MYMINUTE ]

then

MYOWNNAME=${MYOWNNAME/% /$i}

echo $MYOWNNAME

else

echo Your time is over this very minute

exit 0

fi

else

echo The Time has run out

exit 0

fi

else

echo The date is not sufficient

exit 0

fi

done

}

done

Проверка работоспособности скрипта:

user1@hp-avrgavr:~$ ./script1&

[1] 2231

user1@hp-avrgavr:~$ To be continued...A

user1@hp-avrgavr:~$

user1@hp-avrgavr:~$ To be continued...AB

Your time is over this very minute

[1]+ Done ./script1

Скрипт, проверяющий наличие процесса, связанного со скриптом из п. 8 и останавливающий его, если количество сообщений, выведенных на экран превысит некоторое число, хранящееся в переменной DIGITAL_FOR_LAB

Проверка на предопределенность переменной DIGITAL_FOR_LAB:

user1@hp-avrgavr:~$ ./script1&

[1] 2740

user1@hp-avrgavr:~$ ./script2

Variable DIGIT_FOR_LAB is not found!

user1@hp-avrgavr:~$

Для проверки работоспособности был изменен скрип из п. 8 — запуск проводится в требуемый час.

Измененный скрипт:

user1@hp-avrgavr:~$ cat script1.1

#!/bin/bash

if [ $# != 2 ]

then

echo No arguments specified!

exit

fi

MYHOUR=$2

MYDAY=$1

MYOWNNAME="To be continued... "

while true

do

{

for i in "A " "B " "C " "D " "E " "F " "G "

do

sleep 20s

DAY=`date +%d`

HOUR=`date +%H`

if [ $DAY - eq $MYDAY ]

then

if [ $HOUR - eq $MYHOUR ]

then

MYOWNNAME=${MYOWNNAME/% /$i}

echo $MYOWNNAME

else

echo The Time has run out

exit 0

fi

else

echo The date is not sufficient

exit 0

fi

done

}

done

Скрип по п. 9:

user1@hp-avrgavr:~$ cat script2

#!/bin/bash

if [ "$DIGIT_FOR_LAB" = "" ]

then

echo Variable DIGIT_FOR_LAB is not found! $DIGIT_FOR_LAB

else

if [ "$!" = "" ]

then

echo Background process was not launched!

else

LAUNCHEDPID=`ps - e | grep - c $!`

if [ $LAUNCHEDPID - ne 0 ]

then

{

echo Launched process: $!

let i=0

until [ "$i" - ge "$DIGIT_FOR_LAB" ]

do

{

sleep 20s;

let i+=1

}

done

echo It is time to kill the process!

kill $!

}

else

echo This process is not running at the moment

fi

fi

fi

Проверка работоспособности скрипта:

user1@hp-avrgavr:~$ echo $DIGIT_FOR_LAB

3

user1@hp-avrgavr:~$ ./script&

[1] 3136

user1@hp-avrgavr:~$ ./script2

Launched process: 3136

To be continued...A

To be continued...AB

To be continued...ABC

It is time to kill the process!

[1]+ Terminated./script

Скрипт, закрывающий все процессы, запущенные в п. 7, 8, 9 через 5-10 минут.

Используется файл F1.var, созданный при старте имитируемой оболочки, содержащий PID всех процессов. Было изменено задание с целью ускорения проверки работоспособности скрипта: процессы закрываются спустя 30 секунд после запуска скрипта.

user1@hp-avrgavr:~$ cat script3

#!/bin/bash

ps > F2.var

comm -13 F1.var F2.var | cut --bytes 2-6 > F3.var

sleep 30s

cat F3.var | while read n

do

Process_launched=`ps | grep - c "$n"`

if [ $Process_launched - ne 0 ]

then

{

if [ $n - ne $$ ]

then

kill $n

echo $n was killed

fi

}

else

echo Process $n is not launched

fi

done

Проверка работоспособности скрипта:

user1@hp-avrgavr:~$ ./script&

[1] 7052

user1@hp-avrgavr:~$ ./script2 &

[2] 7058

user1@hp-avrgavr:~$ Launched process: 7052

user1@hp-avrgavr:~$ ./script3

To be continued...A

To be continued...AB

7052 was killed

Process 7053 is not launched

7058 was killed

Process 7062 is not launched

Process 7068 is not launched

[1]- Terminated ./script

[2]+ Terminated ./script2

Возврат в исходную оболочку:

user1@hp-avrgavr:~$ exit

Завершить сеанс работы с ОС после 5 минут запуска некоторого скрипта:

user1@hp-avrgavr:~$ timeout 300 ~/script;exit

To be continued...A

exit