Я пытаюсь установить RipRight в Debian, для которого, похоже, нет готового пакета. Мне трудно заставить скрипт systemd запускать / останавливать RipRight, работающий как демон, потому что он не может записать файл PID в /run
.
Я прошел обычную настройку / make / make install. Я также создал ripright
пользователь / группа и добавил ripright
к cdrom
группа.
Вот сценарий systemd, который я поместил в /etc/systemd/system/ripright.service
:
[Unit]
Description=RipRight
[Service]
Type=forking
PrivateTmp=yes
User=ripright
Group=ripright
RuntimeDirectory=ripright
RuntimeDirectoryMode=0750
ExecStart=/usr/local/bin/ripright \
--daemon \
--w32-filenames \
--require-art \
--folder-art folder.png \
--output-file "%B/%D/%C - %N %T.flac" \
"/opt/ripright/data"
PIDFile=/var/run/ripright/ripright.pid
[Install]
WantedBy=multi-user.target
Я использовал недавно добавленный RuntimeDirectory
директива в скрипте для создания /run/ripright
папка с ripright
как собственник. Этот каталог создается при запуске:
# systemctl daemon-reload
# systemctl start ripright
В отдельном окне:
# ls -lhrt /run
...
drwxr-x--- 2 ripright ripright 40 Jan 5 20:52 ripright
drwxr-xr-x 16 root root 400 Jan 5 20:52 systemd
# ls -lahrt /run/ripright
total 0
drwxr-xr-x 16 root root 540 Jan 5 20:52 ..
drwxr-x--- 2 ripright ripright 40 Jan 5 20:52 .
# su - ripright
$ cd /run/ripright
$ pwd
/run/ripright
$ echo test > one.txt
$ cat one.txt
test
$ rm one.txt
$ exit
Я верю своему systemctl start
команда не возвращается из-за этого и вместо этого зависает. Примерно через минуту время ожидания истекает с:
# systemctl start ripright
Job for ripright.service failed. See 'systemctl status ripright.service' and 'journalctl -xn' for details.
Вот результат выполнения рекомендованных команд:
# systemctl status ripright.service
● ripright.service - RipRight
Loaded: loaded (/etc/systemd/system/ripright.service; enabled)
Active: failed (Result: timeout) since Thu 2017-01-05 20:54:40 EST; 55s ago
Process: 35396 ExecStart=/usr/local/bin/ripright --daemon --w32-filenames --require-art --folder-art folder.png --output-file %B/%D/%C - %N %T.flac /opt/ripright/data (code=exited, status=0/SUCCESS)
Main PID: 33287 (code=killed, signal=TERM)
Jan 05 20:53:10 ripperd ripright[35397]: Started daemon mode (v0.11)
Jan 05 20:53:10 ripperd ripright[35398]: Waiting for a CD (/dev/cdrom)
Jan 05 20:54:40 ripperd systemd[1]: ripright.service start operation timed out. Terminating.
Jan 05 20:54:40 ripperd systemd[1]: Failed to start RipRight.
Jan 05 20:54:40 ripperd systemd[1]: Unit ripright.service entered failed state.
# journalctl -xn
-- Logs begin at Thu 2017-01-05 00:30:29 EST, end at Thu 2017-01-05 20:54:40 EST. --
Jan 05 20:52:00 ripperd ripright[35380]: Waiting for a CD (/dev/cdrom)
Jan 05 20:52:59 ripperd su[35385]: Successful su for ripright by root
Jan 05 20:52:59 ripperd su[35385]: + /dev/pts/1 root:ripright
Jan 05 20:52:59 ripperd su[35385]: pam_unix(su:session): session opened for user ripright by vagrant(uid=0)
Jan 05 20:53:10 ripperd ripright[35397]: Started daemon mode (v0.11)
Jan 05 20:53:10 ripperd ripright[35398]: Waiting for a CD (/dev/cdrom)
Jan 05 20:53:33 ripperd su[35385]: pam_unix(su:session): session closed for user ripright
Jan 05 20:54:40 ripperd systemd[1]: ripright.service start operation timed out. Terminating.
Jan 05 20:54:40 ripperd systemd[1]: Failed to start RipRight.
-- Subject: Unit ripright.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit ripright.service has failed.
--
-- The result is failed.
Jan 05 20:54:40 ripperd systemd[1]: Unit ripright.service entered failed state.
Если я закомментирую директиву PIDFile в служебном скрипте systemd:
#PIDFile=/var/run/ripright/ripright.pid
Тогда у меня нет проблем, но также нет файла PID, как рекомендовано для типа службы разветвления:
# systemctl daemon-reload
# systemctl start ripright
# ps -ef | grep ripright
ripright 35438 1 0 21:03 ? 00:00:00 /usr/local/bin/ripright --daemon --w32-filenames --require-art --folder-art folder.png --output-file %B/%D/%C - ripright %T.flac /opt/ripright/data
ripright 35439 35438 0 21:03 ? 00:00:00 /usr/local/bin/ripright --daemon --w32-filenames --require-art --folder-art folder.png --output-file %B/%D/%C - ripright %T.flac /opt/ripright/data
root 35442 31942 0 21:03 pts/0 00:00:00 grep ripright
root@ripperd:~# systemctl status ripright
● ripright.service - A minimal CD ripper for Linux modeled on autorip.
Loaded: loaded (/etc/systemd/system/ripright.service; enabled)
Active: active (running) since Thu 2017-01-05 21:03:11 EST; 13s ago
Process: 35437 ExecStart=/usr/local/bin/ripright --daemon --w32-filenames --require-art --folder-art folder.png --output-file %B/%D/%C - %N %T.flac /opt/ripright/data (code=exited, status=0/SUCCESS)
Main PID: 35438 (ripright)
CGroup: /system.slice/ripright.service
├─35438 /usr/local/bin/ripright --daemon --w32-filenames --require...
└─35439 /usr/local/bin/ripright --daemon --w32-filenames --require...
Jan 05 21:03:11 ripperd ripright[35438]: Started daemon mode (v0.11)
Jan 05 21:03:11 ripperd ripright[35439]: Waiting for a CD (/dev/cdrom)
# ls -la /run/ripright
total 0
drwxr-x--- 2 ripright ripright 40 Jan 5 21:04 .
drwxr-xr-x 16 root root 540 Jan 5 21:04 ..
# systemctl stop ripright
Что интересно, когда я принес PIDFiles
обратно и закомментировал User
и Group
для запуска ripright от имени root, перезагрузка демона, а затем запуск скрипта все еще зависает:
#User=ripright
#Group=ripright
PIDFile=/var/run/ripright/ripright.pid
То же самое произойдет, если я уйду User
и Group
закомментировал и установил PIDFile
для создания файла PID непосредственно в каталоге / run (отмечая, что / var / run - это просто символическая ссылка на / run в Debian Jessie):
#User=ripright
#Group=ripright
#PIDFile=/var/run/ripright/ripright.pid
PIDFile=/run/ripright.pid
Обратите внимание, что во всех случаях я могу нажать Ctrl + C во время зависания, и демон ripright продолжит работу; однако, если я позволю тайм-ауту запуска, он остановит демон перед печатью ошибки и возвратом.
Я тоже прошел эта почта и его комментарии. Первоначальный подход к использованию ExecStartPre
были такие же результаты; Я не ушел далеко с использованием tmpfiles.d
поскольку я не смог найти никакой информации о том, как заставить изменения вступить в силу без перезагрузки. Я попытался mount -a
но это, похоже, не сработало.
Если вы спрашиваете, создаст ли systemd файл PID для демона, этого не произойдет, согласно:
https://www.freedesktop.org/software/systemd/man/systemd.service.html#PidFile=
PIDFile =
Принимает абсолютное имя файла, указывающее на PID-файл этого демона. Использование> этой опции рекомендуется для сервисов, где Type = установлен на разветвление. systemd прочитает PID основного процесса демона после запуска службы. systemd не будет записывать в настроенный здесь файл, хотя он удалит файл после завершения работы службы, если он все еще существует.
Возможно, лучше оставить его пустым и попробовать использовать GuessMainPID =.
К сожалению, systemd не будет создавать PID-файл для службы без разветвления, даже если вы укажете PIDFile=
строка в файле модуля службы. Но вы можете обмануть ExecStartPost=
строка, например:
ExecStartPost=/bin/sh -c 'umask 022; pgrep YOURSERVICE > /var/run/YOURSERVICE.pid'