如何在另一个 systemd 服务启动之前在启动时启动一个 systemd 服务?

如何在另一个 systemd 服务启动之前在启动时启动一个 systemd 服务?

我在一台旧的 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.serviceAfter=,如下所示

[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service

[Service]
User=samsepioldoresh4ze
etcetc
....

但它不起作用!Sonarr 和 Radarr 正常启动,但驱动器未安装!我做错了什么?


另外,rtcwake 在我的笔记本电脑上不起作用 - 我认为这是一个内核问题?!有办法解决这个问题吗?

答案1

您遇到此问题的原因是因为您在使用的After=同时还需要Requires=Wants=

管理依赖项有 3 个主要属性。我将尝试简要解释它们之间的区别,但您可以在以下位置找到更多详细信息:[单位] 部分选项 | freedesktop.org

  1. After=

    此选项仅设置单元的顺序,并不保证服务已完成启动。

  2. Wants=

    此选项允许您的设备仅在另一个设备启动完成后才启动。(无论它是否成功启动)

  3. Requires=

    然而,就像Wants=这样,只有在依赖项成功启动后,这才会使您的单元启动。

您还可以使用每个选项。

  1. After=取反Before=
  2. Wants=取反WantedBy=
  3. 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.servicesonarr.serviceradarr.service单位。

您可以通过运行以下命令来执行此操作而无需修改默认文件(您需要对执行相同操作radarr.service):

systemctl edit sonarr.service

并插入以下内容:

[Unit]
Wants=mountgdrive.service

注意:如果失败,您根本不想启动这两个服务,则可以替换Wants=RequiresWantedBy=与(尽管这通常就足够了,甚至在文档中推荐)。RequiredBy=mountgdrive.serviceWants=

编辑:WantedByRequiredBy选项只能在[Install]部分下使用。(谢谢@洋基

相关内容