Переходим к заданиям потруднее. По традиции будет представлен формат: вопрос — ответ. Разберем работу с процессами, сигналами и приоритетами в Bash. Также затронем тему выполнения отложенных задач, и, разумеется, напишем их сами.
Поехали:
- Узнать имя файла устройства того терминала, на котором вы вошли в сеанс.
tty
- Вывести список запущенных в текущем терминале процессов.
ps
- Вывести список всех процессов, в виде таблицы с колонками ID процесса, ID родительского процесса, имя процесса.
ps -A
- Выведите список процессов, запущенных пользователями, вошедшими в сеанс.
w
- Получите список всех процессов, связанных с терминалами.
ps -t
- Выведите PID процессов, связанных с каталогом /usr.
ps -C /usr
- Выведите список процессов, содержащих «man» в имени.
ps -f | grep man
- Получите иерархический список процессов с помощью команды ps (не pstree).
ps axjf
- Вывести id текущей оболочки bash.
echo $$
- Найдите пустые файлы в каталоге linux_lab2 в фоновом режиме.
find d1/ -empty &
- Подтвердите тип содержимого двух из найденных файлов?
file pusto-1
- Запустить в фоновом режиме команду sleep 1000 и sleep 2000. Вывести информацию о запущенных задачах.
sleep 1000 &
sleep 2000 &
jobs - Убить одной командой все запущенные задачи sleep.
pkill sleep
- Проверить, как задача sleep 1000, запущенная в фоновом режиме, реагируют на сигналы HUP, INT, QUIT, TRAP, KILL, TERM.
hup — Обрыв терминальной линии
int — Прерывание
quit — Выход
trap — Ловушка трассировки/останова
kill — убито
TERM — Завершено - Запрограммировать оболочку bash таким образом, чтобы при получении ей сигнала HUP она выводила список всех запущенных процессов в файл, содержащий в названии id текущей оболочки bash.
trap " ps > file-$(echo $$)" HUP
- Запустите команду sleep 10000 в фоновом режиме с приоритетом 10.
nice -n 10 sleep 10000 &
- Увеличьте приоритет предыдущей команды на 6 пунктов.
renise 16 3541[id]
- Уменьшите приоритет предыдущей команды на 10 пунктов.
Приоритет изменился? Как изменить приоритет?
renise 6 3541[id]
(Приоритет не изменился, отказано в доступе. Можно изменить от root.) - От имени суперпользователя запустить команду индексирования базы данных поиска в следующем виде: sudo time nice -n 19 updatedb. Затем выполните такую же команду, в которой значение nice number для updatedb будет 5. Сравнить полученные
результаты.
Ответ: при запуске одинаковых команд с разными приоритетами время выполнение тоже будет разное. - От имени обычного пользователя попытайтесь запустить оболочку bash со значением nice number, равным -1. Какое сообщение выводится?
nice: невозможно установить значение nice: Отказано в доступе. - Для непрерывного просмотра запущенных в системе процессов установите время обновления 10 сек. Какое время установлено по умолчанию?
top -d 10
6 сек по умолчанию - Просмотрите список запущенных вами процессов в непрерывном режиме.
top -u nikiqq
- Организуйте завершение команды top после десяти обновлений.
top -n 10
Отложенное и регулярное выполнение задач
- Создайте файл, содержащий полный список процессов, полученный через 10 минут от текущего времени.
at now +10 minutes
at> ps > file1
at> "Ctrl + d" - Проверьте, запущены ли какие-нибудь задания в cron или at для пользователя root.
at -l
crontab -l - При помощи команды at сделать так, чтобы ровно через 5 минут от текущего времени произошла запись списка всех процессов в файл с именем, содержащим в своём названии системное время на момент записи.
at now + 5 minutes
at> ps > file-$(date +%T)
at> "Ctrl + d" - При помощи команды at организовать обычное завершение работы браузера firefox или chrome в 16:00.
at 16:00
at> pkill firefox
at> "Ctrl + d" - Сделать при помощи cron так, чтобы команда updatedb запускалась раз в сутки, каждый час, каждые 5 минут.
echo '58 16 * * * updatedb' > crontab1
echo '58 * * * * updatedb' > crontab1
echo '0,5,10,15,20,25,30,35,40,45,50,55 * * * * updatedb' > crontab1 - При помощи команды at сделать так, чтобы через 5 минут от текущего времени создалось задание для cron, которое создавало бы каждые 9 минут ещё одно задание для cron, заключающееся в том, чтобы каждые 7 минут уничтожать все задания пользователя для cron.
at now + 5 minutes
at> echo '9 * * * * echo '7 * * * * pkill cron '' > crontab1
at> crontab crontab1
at> "Ctrl + d" - Ежедневно в 10:30 требуется получать список пользователей, входивших в сеанс в последнее время.
echo '30 10 * * * last' > crontab1
(заходим в редактор)
crontab -e
crontab crontab1
( устанавливаем таблицу)
от root:crontab -e -u nikiqq
в редакторе выбираем цифру 1 и таблица с заданиями отобразилась.
Будьте первым, кто оставит комментарий