Недавно я задумался, а как создать 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
