我在一台旧的 HP 笔记本电脑上运行 Ubuntu 16.04
我在上面安装了一些软件,以创建一个小型自制 plex 服务器。我安装了 sonarr、radarr、deluge、jackett 等,它们都会在启动时自动启动!
几天前,我也决定安装 rclone,并且创建了(感谢 GitHub 项目)几个文件夹,每次启动时都必须通过启动脚本来挂载这些文件夹(我通过终端写入来启动它sudo ~/bin/check.mount
)。Sonarr 和 Radarr 设置为通过 deluge 下载内容到临时文件夹,然后将其导出到这两个挂载文件夹之一。
问题是,当我手动启动脚本时,Sonarr/Radarr 已经启动并运行并且找不到它们的根文件夹,所以它们给我一个错误。
我想要做的是创建一个 mountgdrive.service(服务或任何必要的服务)来自动启动 check.mount 脚本,如果这还不够,则在 sonarr.service 和 radarr.service 中插入延迟!这可能吗?
我写了这个sudo nano /etc/systemd/system/mountgdrive.service
[Unit]
Description=MountSmokeScreen
After=network.target
[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
并添加到 sonarr.service 和 radarr.servicemountgdrive.service
中After=
,如下所示
[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service
[Service]
User=samsepioldoresh4ze
etcetc
....
但它不起作用!Sonarr 和 Radarr 正常启动,但驱动器未安装!我做错了什么?
另外,rtcwake 在我的笔记本电脑上不起作用 - 我认为这是一个内核问题?!有办法解决这个问题吗?
答案1
您遇到此问题的原因是因为您在使用的After=
同时还需要Requires=
或Wants=
。
管理依赖项有 3 个主要属性。我将尝试简要解释它们之间的区别,但您可以在以下位置找到更多详细信息:[单位] 部分选项 | freedesktop.org
After=
此选项仅设置单元的顺序,并不保证服务已完成启动。
Wants=
此选项允许您的设备仅在另一个设备启动完成后才启动。(无论它是否成功启动)
Requires=
然而,就像
Wants=
这样,只有在依赖项成功启动后,这才会使您的单元启动。
您还可以使用逆每个选项。
After=
取反Before=
Wants=
取反WantedBy=
Requires=
取反RequiredBy=
要解决您的问题,您需要将挂载服务更改为:
[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service
[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target sonarr.service radarr.service
或者您可以添加Wants=mountgdrive.service
到sonarr.service
和radarr.service
单位。
您可以通过运行以下命令来执行此操作而无需修改默认文件(您需要对执行相同操作radarr.service
):
systemctl edit sonarr.service
并插入以下内容:
[Unit]
Wants=mountgdrive.service
注意:如果失败,您根本不想启动这两个服务,则可以替换Wants=
为Requires
或WantedBy=
与(尽管这通常就足够了,甚至在文档中推荐)。RequiredBy=
mountgdrive.service
Wants=
编辑:WantedBy
和RequiredBy
选项只能在[Install]
部分下使用。(谢谢@洋基)