---
# System prepended metadata

title: lesson 3

---

# lesson 3
# Цель
Практика в:
● понимании системных путей
● расположении файлов приложения в разных частях файловой системы
● создании стартовых скриптов для сервисов
● упаковке приложений в переносимый артефакт
# Задача
Дописать скрипты так, чтобы:
● При запуске start-pinger.sh главный скрипт (pinger.sh) запускался от
пользователя
● Pidfile записывался в /run/pinger/pinger.pid (без участия systemd)
● Логи записывались в /var/log/pinger/pinger.log

Упаковать в архив все необходимые скрипты и каталоги с сохранением путей, владельцев
и прав и прислать архив нам:
● pinger.sh
● start/stop скрипты
● конфиги logrotate
● systemd unit
● все необходимые каталоги
# Критерии оценки
● Упакованы скрипты pinger.sh, start-pinger.sh, stop-pinger.sh, конфиги
logrotate, systemd unit
● Сделаны все перечисленные модификации
● Созданы все необходимые каталоги с нужными пользователем и правами доступа

# Решение:
Напишу сразу, не получилось настроить unit файл, чтобы сервис запускался через start-pinger.sh, сделал запуск через pinger.sh, а так если запускать отдельно start-pinger.sh то он запускает pinger.sh
# Создаем директорию для работы и переходим туда: 
mkdir -p /lessons/lesson3/
cd /lessons/lesson3/
# Создаем пользователя pinger 
useradd -M pinger (-M, чтобы не создавать домашнюю директорию)
# Создаем 3 файла pinger.sh, start-pinger.sh, stop-pinger.sh
vim ./pinger.sh

#!/bin/bash
while true; do
 date >> /var/log/pinger/pinger.log 2>&1 | pgrep pinger > /run/pinger/pinger.pid &
 sleep 1
done
![](https://i.imgur.com/6pCg2MB.png)
vim ./start-pinger.sh

#!/bin/bash
sudo -u pinger /lessons/lesson3/pinger.sh &
![](https://i.imgur.com/G87UMUy.png)
vim ./stop-pinger.sh

#!/bin/bash
pkill -F /run/pinger/pinger.pid \
        && rm -f /run/pinger/pinger.pid
![](https://i.imgur.com/1w34LeR.png)
# Делаем файлы исполняемыми
chmod +x ./pinger.sh ./start-pinger.sh ./stop-pinger.sh
# Меняем владельца папки и файлов lesson3
chown -R pinger:pinger /lessons/lesson3/
# Создаем директорию и меняем владельца для записи pid номера скрипта в одельный файл
mkdir -p /run/pinger/ | chown -R pinger:pinger /run/pinger/
# Создаем директорию и меняем владельца для записи вывода скрипта в одельный файл
mkdir -p /var/log/pinger | chown -R pinger:pinger /var/log/pinger
# Пробуем запустить и остановить скрипт start-pinger.sh и stop-pinger.sh
# Снала убеждаемся что нет запущенных pinger:
![](https://i.imgur.com/wOrXt2d.png)
# Запускаем: ./start-pinger.sh
# Убеждаемся об успешном запуске, главный скрипт запустился под пользователем pinger:
![](https://i.imgur.com/7nZa9Mf.png)
# Проверяем наличие pid номера в отдельном файле
cat /run/pinger/pinger.pid

![](https://i.imgur.com/CBqCk7m.png)

# Проверяем запись вывода скрипта в файл
tail -f /var/log/pinger/pinger.log
![](https://i.imgur.com/YnrcW5V.png)

# Останавливаем скрипт ./stop-pinger.sh
# Убеждаемся что скрипт остановился
ps aux | grep pinger
![](https://i.imgur.com/fpIEVMc.png)
# Убеждаемся, что скрипт очистил за собой файл pinger.pid
ls -la /run/pinger/
![](https://i.imgur.com/Ml8EnLP.png)

# Создаем конфиг для ротирования лог файла
vim /etc/logrotate.d/pinger

/var/log/pinger/*.log {
daily #еждневная проверка условий
dateext #добавляет дату конце
rotate 4 #хранит последние 4 лога
size 2K #максимальный размер лога, чтобы сработала ротация
compress #сжимает и архивирует файл
delaycompress #последний лог файл не трогает
}
![](https://i.imgur.com/xkLbrn0.png)
# Для проверки ротации запустим принудительно logrotate
logrotate -f /etc/logrotate.d/pinger
# Смотрим результат
![](https://i.imgur.com/GglyWgu.png)
# Создаем unit файл
vim /etc/systemd/system/pinger.service

[Unit]
Description=Pinger service
After=network.target network-online.target remote-fs.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=pinger
Group=pinger
EnvironmentFile=-/etc/default/pinger
ExecStart=/lessons/lesson3/pinger.sh
ExecStop=/lessons/lesson3/stop-pinger.sh

![](https://i.imgur.com/1Dk3HHO.png)
# Сохраняем и перезагружаем deamon
systemctl daemon-reload
# Пробуем запустить сервис
systemctl start pinger
# Проверяем статус
systemctl status pinger
![](https://i.imgur.com/QyRPDoK.png)
ps aux | grep pinger
![](https://i.imgur.com/2Dpw8jM.png)
# Проверяем наличие файла pinger.pid и pid номера в нем
![](https://i.imgur.com/36wNZXv.png)
# Проверяем наличие записи в pinger.log
tail -f /var/log/pinger/pinger.log
![](https://i.imgur.com/vPf2wgm.png)
# Останавливаем сервис
systemctl stop pinger
# Проверяем статус
systemctl status pinger
![](https://i.imgur.com/TE1J0OV.png)
ps aux | grep pinger
![](https://i.imgur.com/hfHLhpK.png)
# Проверяем удаление файла pinger.pid
![](https://i.imgur.com/ncxhTli.png)
# Проверяем остановку записи в файл pinger.log
![](https://i.imgur.com/DmXLplM.png)


