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

Поиск

Метки

adb antiddos bash bubble cache console ddos debian docker eclipse elasticsearch elk ffmpeg fs gentoo glusterfs grafana healthcheck hicam ipcam jquery jscript mail mysql mysqldump nginx nodejs php putty python redirect replication RSS serial socat ssh ssh-agent sysfs systemd tinymce uart usb vim vnc windows

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

© 2025 Root Only