Недавно я задумался, а как создать systemd-timer для текущего пользователя без sudo прав, ведь c cron в этом вопросе проблем не было? Оказывается можно создавать локальные для пользователя systemd таймеры и сервисы и никакой root или sudo не нужны для создания файлов в /etc/systemd/system/
! И как оказалось это касается не только таймеров и сервисов но и вообще всех сущьностей.
И так у меня есть задача конвертировать записи экрана сделанные с помощью Spectacle из vp9/webm в h264/mp4 и h265/mp4, так как он не умеет ещё в аппаратное энкодирование с GPU , а собственные записи в h264/mp4 крайне плохого кчества о чём был даже баг.
Создаём нужный подкаталог и сервисный файл:
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/screencast-transcoder.service
Сам screencast-transcoder.service:
[Unit]
Description=Screencast Transcoder Script
After=graphical-session.target
[Service]
Type=simple
ExecStart=/home/user/.local/bin/sc_formater_nvenc.sh
Restart=on-failure
Environment=DEBUG=false
[Install]
WantedBy=default.target
Обновляем список и стартуем сервис:
systemctl --user daemon-reexec
systemctl --user daemon-reload
systemctl --user enable --now screencast-transcoder.service
systemctl --user status screencast-transcoder.service
Если надо, то смотрим логи:
journalctl --user -o short -n 10 -f -u screencast-transcoder.service
---
Если вдруг вам интересно, то скрипт выглядит так:
#!/bin/bash
set -euo pipefail
DEBUG=${DEBUG:-false}
if ${DEBUG}; then
set -x
fi
DN="${HOME}/Videos/Screencasts"
while true; do
if FN=$(inotifywait -e close_write,moved_to --format %f "${DN}"); then
if [[ "${FN##*.}" == "webm" ]]; then
INPUT="${DN}/${FN}"
BASENAME="${FN%.webm}"
# H.264
ffmpeg \
-hide_banner \
-hwaccel cuda \
-i "${INPUT}" \
-c:v h264_nvenc \
-cq 23 \
-preset p7 \
-f mp4 "${DN}/${BASENAME}.h264.mp4" &
# HEVC / H.265
ffmpeg \
-hide_banner \
-hwaccel cuda \
-i "${INPUT}" \
-c:v hevc_nvenc \
-cq 23 \
-preset p7 \
-f mp4 "${DN}/${BASENAME}.hevc.mp4" &
fi
fi
done