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


9

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

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

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

问题是,当我手动启动脚本Sonarr / Radarr时,它们已经启动并正在运行,并且找不到其根文件夹,因此它们给我一个错误。

我想做的是创建一个mountgdrive.service(服务,或任何必要的东西)以自动启动check.mount脚本,如果还不够,请在sonarr.service和radar.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.service mountgdrive.serviceAfter=位,这样

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

[Service]
User=samsepioldoresh4ze
etcetc
....

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


另外,rtcwake无法在我的笔记本电脑上运行-我认为这是内核问题?有办法解决吗?


1
如果我理解正确的话,你想sonarr.serviceradarr.service后运行mountgdrive.service启动并运行?

@丹!问题是,我编写它的方式显然mountgdrive.service可以运行,但是什么也不做(它不装载驱动器),然后由于ubuntu执行sonarr.serviceradarr.service正常运行mountgdrive.service
samsepioldoloresh4ze 18-4-14

1
我也建议您调查一下.mount单位。如果您mountgdrive.service正在做的只是安装目录或类似目录,则可以将其更改为.mount服务。因为它使它更加可靠,特别是因为您对它有依赖性。

Answers:


26

您遇到此问题的原因是因为您在使用After=时还需要Requires=or 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.service失败(虽然Wants=通常是不够的,甚至在文档推荐)。

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


感谢Wants=WantedBy=,我一定会用的!!我重新启动笔记本电脑i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze

1
脚本中似乎有错误。您可以从以结尾的行中看到它Can't open /.config/SmokeScreen/smokescreen.conf。也许您的脚本中包含“〜/ .config / ...”。您应将波浪号(~)替换为完整路径,即/home/you_user_name/.config/....(或使用脚本的相对路径)
Dan

github.com/FourFingerLifeHug/SmokeScreen/blob/master / ...-这是check.mount脚本,所以我应该用完整路径更改所有$(HOME)和$(bindir)?谢谢!
samsepioldoloresh4ze

1
@ samsepioldoloresh4ze $HOME是的,在启动时不可用,因为还没有登录用户。

应该WantedBy=[Unit]部分中?我以为它只能进去[Install]
杨基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.