Root Only

подайте на пропитание, бывшему админу бывшего локалхоста

Menu
  • Администрирование
  • Программирование
  • Монетизация
  • Продвижение
  • Хлам
Menu

Практическое использование systemd timer

В продолжение темы ip-камер, хочу поделиться способом сборка видеологов с камеры.

Сбор будет производится связкой python + bash, python здесь выступает в качестве поставщика видео-потока, а bash — все остальное.
Суть алгоритма — снимая данные с встроенного в ip-камеру детектора движения при его наличии начать запись видео в формате h264 с помощью ffmpeg в файл с именем в формате YYYY-MM-DD/HH-MM-SS. Длительность записи выбрана произвольно, 360 секунд.

Ниже представлен bash-скрипт с небольшими комментариями, реализующий все вышеописанное, а так-же способ его периодического выполнения средствами systemd.

#!/bin/bash

# здесь делаем проверку, не запущен ли уже экземпляр скрипта
# фактически, что запись ещё не ведётся, если чесно, то
# этот код здесь ненужен, так-как фактически systemd таймер
# будет запускать скрипт по истечении 5 сек после завершения
# его запущенного до этого экземпляра.
PID=/run/lock/ipcam.run
pgrep -F $PID >/dev/null 2>&1 && exit
echo $ > $PID

DIR=/home/ipcam/video

# следующая команда получает данные с датчика движения камеры,
# в вашем случае url может быть другим в значение 
# Authorization: Basic содержится пара login:password
# кодированная в формат base64
# для получения своей строки достаточно выполнить
# echo mylogin:mypassw | base64 
M=$(curl -s -H 'Authorization: Basic bG9naW46cGFzc3dvcmQK' http://myipcam.domain/NetSDK/Video/motionDetection/channel/1/status)
# ответом должна быть строка, с содержимым либо true, либо false
if [ "$M" == 'true' ]; then
	SUBDIR=$(date "+%Y-%m-%d")
	FILE=$(date "+%H_%M_%S_%N")
	mkdir -p "${DIR}/${SUBDIR}"
# здесь в течении 360 секунд пишем видео во временный файл
	timeout 360 ~/bin/ipcam.py 2>/dev/null | ffmpeg -loglevel error -i - -f h264 -nostdin "${DIR}/${SUBDIR}/${FILE}.mp4~" 2>> "${DIR}/${SUBDIR}.log"
# после чего, приводим его в человеческий вид
	ffmpeg -loglevel error -i "${DIR}/${SUBDIR}/${FILE}.mp4~" -c copy "${DIR}/${SUBDIR}/${FILE}.mp4"
	rm "${DIR}/${SUBDIR}/${FILE}.mp4~"
fi

Добавляем нового пользователя, предполагая, что вышеприведённый скрипт будет размещён в папке /home/ipcam/bin/, в ней-же должен уже лежать файл ipcam.py, речь о котором шла в предыдущей статье.

useradd -m ipcam
chmod 750 /home/ipcam
# далее от имени пользователя ipcam создаём папки bin и video
su - ipcam
mkdir bin video
# WARNING: т.к. в исполняемых файлах содержится логин/пароль, необходимо закрыть их от посторонних глаз
chmod 750 bin/*

Создаём юнит systemd, с помощью которого будем запускать наш скрипт
# /etc/systemd/system/ipcam.service

[Unit]
Description=LSB: Start Motion detection
Before=shutdown.target
After=local-fs.target remote-fs.target
Conflicts=shutdown.target

[Service]

ExecStart=/home/ipcam/bin/motion_detect.sh

User=ipcam
Group=ipcam

[Install]
WantedBy=multi-user.target

и собственно сам файл-таймер, в котором обозначаем нужную нам периодичность запуска скрипта (5 сек)
# /etc/systemd/system/ipcam.timer

[Unit]
Description=Check motion ipcam

[Timer]
OnUnitInactiveSec=5s
AccuracySec=1s

После добавления юнитов делаем reload демону systemd и включаем наш таймер.

systemctl daemon-reload
systemctl enable ipcam.service
systemctl start ipcam.service

Посмотреть состояние всех таймеров в системе можно командой

systemctl list-timers --all

Поиск

Метки

archlinux awk bash binlog cache console css debian docker ffmpeg filemanager hash healthcheck ipcam java jquery jscript loginza mail md5 mysql mysqldump netbeans nginx php PHP-функция на JScript python qemu quote redirect replication RSS session sniffer socat systemd tinymce unix-socket usb vim windows 7 youtube авторизация продвижение социальные сети

Безопасность

© 2023 Root Only