
Лабораторная работа 3 / Лабораторная работа 3
.docЛабораторная работа №3. Мониторинг процессов в ОС Linux
1. Посчитать количество процессов, запущенных пользователем user, и вывести в файл пары PID:команда для таких процессов.
#!/bin/bash
ps -U user -o pid,command | tail -n +2 | sed -r "s/\s*([0-9]+)\s(.+)$/\1:\2/" > ans1.tmp
2. Вывести на экран PID процесса, запущенного последним (с последним временем запуска).
#!/bin/bash
ps -Ao pid,stime | tail -n +2 | sort -r -k2 | head -9 | sort -k2 | head -1 | awk '{print $1}'
3. Вывести в файл список PID всех процессов, которые были запущены командами, расположенными в /sbin/
#!/bin/bash
for i in $(ls /proc/ | grep "[0-9]\+")
do
echo $i | readlink /proc/$i/exe | grep "/sbin" | echo $i >> ans3.tmp
done
4. Для каждого процесса посчитать разность резидентной и разделяемой части памяти процесса (в страницах). Вывести в файл строки вида PID: разность, отсортированные по убыванию этой разности.
#!/bin/bash
ps -A -o pid | tail -n +2 | gawk '{file1="/proc/"$1"/statm"; getline f<file1; close (file1); split(f, a); print $1, ":", a[2]-a[3]}' | tr -d " " | sort -r -n -t ":" -k2 > ans4.tmp
5. Для всех зарегистрированных в данный момент в системе процессов выведите в один файл строки ProcessID=PID: Parent_ProcessID=PPID: Average_Sleeping_Time=SleepAVG. Значения PPid и SleepAVG возьмите из файлов status, которые находятся в директориях с названиями, соответствующими PID процессов в /рrос . Отсортируйте эти строки по идентификаторам родительских процессов.
#!/bin/bash
status=""
for pid in $(ps -A -o pid | tail -n +2)
do
file="/proc/"$pid"/status"
file1="/proc/"$pid"/sched"
ppid=$(grep -E -h -s -i "ppid:\s(.+)" $file | grep -o "[0-9]\+")
sleepavg=$(grep -E -h -s -i "avg_atom(.+)" $file1 | grep -o "[0-9.]\+")
if [[ -z $sleepavg ]]
then sleepavg=0
fi
if [[ $ppid != "" ]]
then status=$status"ProcessID="$pid" : Parent_ProcessID="$ppid" : Average_Sleeping_Time="$sleepavg$'\n'
fi
done
echo "$status" | sort -t " " -k2 > ans5.tmp
6. В полученном на предыдущем шаге файле после каждой группы записей с одинаковым идентификатором родительского процесса вставить строку вида Average_Sleeping_Children_of_ParentID=N is М, где N = PPID, а М - среднее, посчитанное из SleepAVG для данного процесса.
#!/bin/bash
ppid=0
sleepavg=0
count=0
b=""
while read a
do
if [[ -n $a ]]
then
newppid=$(echo $a | grep -E -h -s -i -o "Parent_ProcessID=[0-9]+" | grep -o "[0-9]\+")
newsleepavg=$(echo $a | grep -E -h -s -i -o "Average_Sleeping_Time=[0-9.]+" | grep -o "[0-9.]\+" | awk '{printf("%s",$1)}')
if [[ $ppid == $newppid ]]
then sleepavg=$(echo "$sleepavg+$newsleepavg" | bc -l -q)
count=$(echo "$count+1" | bc -l -q)
else
sleepavg=$(echo "$sleepavg/$count" | bc -l -q)
if [[ -n $b ]]
then
b=$b"Average_Sleeping_Children_of_ParentID="$ppid" is "$sleepavg$'\n'
fi
sleepavg=$newsleepavg
ppid=$newppid
count=1
fi
b=$b$a$'\n'
fi
done < ans5.tmp
sleepavg=$(echo "$sleepavg/$count" | bc -l -q)
if [[ -n $b ]]
then
b=$b"Average_Sleeping_Children_of_ParentID="$ppid" is "$sleepavg$'\n'
fi
echo "$b" > ans6.tmp