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

sam*_*4ze 12 startup scripts automount systemd

我在旧的 HP 笔记本电脑上运行 Ubuntu 16.04

我已经在上面安装了一些软件来创建一个小型的自制 plex 服务器。我已经安装了声纳、雷达、洪水、夹克等,它们都在启动时自动启动!

几天前,我决定也安装 rclone 并且我已经创建(感谢 GitHub 项目)几个文件夹,必须在每次启动时通过启动脚本(我通过终端编写启动它sudo ~/bin/check.mount)来安装这些文件夹。Sonarr 和 Radarr 设置为通过 deluge 将内容下载到临时文件夹,然后将其导出到这两个安装的文件夹之一。

问题是,当我手动启动脚本时,Sonarr/Radarr 已经启动并运行,并且找不到它们的根文件夹,所以他们给了我一个错误。

我想做的是创建一个 mountgdrive.service(服务,或任何必要的服务)来自动启动 check.mount 脚本,如果这还不够,请在 sonar.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
Run Code Online (Sandbox Code Playgroud)

并在位mountgdrive.service中添加到sonarr.service 和radarr.service After=,像这样

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

[Service]
User=samsepioldoresh4ze
etcetc
....
Run Code Online (Sandbox Code Playgroud)

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


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

Dan*_*Dan 35

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

有 3 个主要属性用于管理依赖项。我将尝试简要解释差异,但您可以在[Unit] Section Options | 中找到更多详细信息。自由桌面网站

  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
Run Code Online (Sandbox Code Playgroud)

或者您可以添加Wants=mountgdrive.servicesonarr.serviceradarr.service单位。

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

systemctl edit sonarr.service
Run Code Online (Sandbox Code Playgroud)

并插入以下内容:

[Unit]
Wants=mountgdrive.service
Run Code Online (Sandbox Code Playgroud)

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

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