无法在systemd服务脚本中创buildPID文件

我试图让RipRight安装在Debian上,对此,似乎没有任何预先构build的软件包。 我很难得到一个systemd脚本来启动/停止作为守护进程运行的RipRight,因为它不能将PID文件写入/run

我经历了通常的configuration/ make / make安装。 我还创build了一个ripright用户/组,并添加riprightcdrom组。

这是我放在/etc/systemd/system/ripright.service的systemd脚本:

 [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指令来创build一个ripright作为所有者的/run/ripright文件夹。 我运行时会创build这个目录:

 # 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. 

如果我在systemd服务脚本中注释掉PIDFile指令:

 #PIDFile=/var/run/ripright/ripright.pid 

然后我没有任何问题,但也没有推荐用于分叉服务types的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带回来并注释掉UserGroup以root身份运行ripright时,守护进程重新加载然后启动脚本仍然挂起:

 #User=ripright #Group=ripright PIDFile=/var/run/ripright/ripright.pid 

如果我留下UserGroup注释并设置PIDFile直接在/ run目录中生成PID文件(注意/ var / run只是在Debian Jessie中运行的符号链接),则会发生同样的情况:

 #User=ripright #Group=ripright #PIDFile=/var/run/ripright/ripright.pid PIDFile=/run/ripright.pid 

请注意,在所有情况下,我可以在挂起过程中按Ctrl + C,并且ripright守护进程将继续运行; 但是,如果我让开始时间结束,它会在打印错误并返回之前停止守护进程。

我也经历了这个post及其评论。 使用ExecStartPre的初始方法具有相同的结果; 我没有用tmpfiles.d得到tmpfiles.d因为我找不到任何有关如何在不重新启动的情况下使更改生效的信息。 我试着mount -a但似乎没有工作。

如果你问是否systemd会为守护进程创build一个PID文件,

https://www.freedesktop.org/software/systemd/man/systemd.service.html#PidFile=

PIDFILE =

取一个绝对文件名,指向这个守护进程的PID文件。 对于Type =设置为分叉的服务,build议使用此选项。 systemd将在启动服务之后读取守护进程的主进程的PID。 systemd不会写入这里configuration的文件,尽pipe如果它仍然存在,它将在服务closures后删除文件。

把它留空并尝试使用GuessMainPID =可能会更好。