如何设置systemd单元在加载桌面后启动?

如何设置systemd单元在加载桌面后启动?

我为 x0vncserver 创建了 systemd 单元,如下所示

[Unit]
Description=Remote desktop service (VNC)
After=graphical.target


[Service]
Type=forking
User=user
ExecStart=/usr/bin/sh -c '/usr/bin/x0vncserver -display :0 -rfbport 5900 -passwordfile /home/user/.vnc/passwd &'

[Install]
WantedBy=multi-user.target

并使其能够运行但失败。然后我意识到,当我尝试使用 x0vncserver 加载原始桌面时,我只能在完全加载桌面本身之后才能执行此操作。所以我必须将系统单元设置为在加载桌面后运行,但是如何呢?或者有什么定时方式可以设置吗?虽然使用桌面会话工具可能是可能的,但是有任何 systemd 方式的解决方案吗?

我的 default.target 是

# systemctl 获取默认值       
图形目标

答案1

在查看了缺乏不包含某种额外解决方法的答案之后,我自己想出了这个解决方案。毕竟解决方案在单元文件中,我检查了系统单元“After=”下的 man 文件,要求在启动当前单元之前运行某个目标/服务,仅“Requires=”将同时启动该服务及其依赖项。以下是该手册的引用:

如果单元 foo.service 需要使用 Requires= 配置的单元 bar.service,并且没有使用 After= 或 Before= 配置排序,那么如果激活 foo.service,两个单元将同时启动,并且它们之间没有任何延迟。

因此,如果 x 服务器和 x0vncserver 同时启动,x0vncserver 将因无法连接到已初始化的 x 服务器而失败。我需要专门将我的 DM 添加到“Requires=”和“After=”才能使其正常工作。现在这已经完成了,它每次都有效,不需要任何额外的魔法。您需要将“nodm.service”条目替换为您正在使用的特定显示管理器。 “重新启动”行的存在是为了防止我决定通过注销来重新启动会话,这将终止 X 服务器,然后立即重新启动它(因为我使用的是 nodm)。我不确定,但我认为这也适用于使用标准 DM 时,因为 x 服务器将运行登录,然后在成功登录后用新用户 x 会话替换它来终止。这样做的唯一副作用是 VNC 会话被断开并需要重新启动,但我认为如果没有进一步的魔法,就没有任何解决该特定问题的方法。

这是我的[电子邮件受保护]文件:

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target multi-user.target nodm.service
Requires=nodm.service

[Service]
Type=simple
ExecStart=/usr/bin/x0vncserver -display %i -rfbport 5900 -securitytypes none
Restart=always
RestartSec=3


[Install]
WantedBy=multi-user.target

作为补充说明,我建议将“-securitytypes”指令修改为更安全的内容,因为我只是在本地网络中使用它,其中我是唯一的用户,并且不关心任何安全问题。

答案2

第一个建议对我不起作用。所以我尝试了一种解决方法。我将我的 x0vncserver systemd 单元设置如下

[Unit]
Description=Remote desktop service (VNC)
After=multi-user.target

[Service]
Type=forking
User=user
ExecStart=/bin/sh -c '/usr/bin/x0vncserver -display :0 -rfbport 5900 -passwordfile /home/user/.vnc/passwd &'

[Install]
WantedBy=default.target

然后,由于上述服务尝试在桌面:0 加载之前加载而失败,我设置了一个 systemd 计时器单元,以便在定义的时间后x0vncserver.timer运行该x0vncserver.service单元,考虑到我的机器的桌面加载时间(旧配置很差),如下所示

[Unit]
Description=x0vncserver timer

[Timer]
# Time to wait after booting before it run for first time
OnBootSec=2m
Unit=x0vncserver.service

[Install]
WantedBy=default.target

然后我激活计时器单元systemctl enable x0vncserver.timer并重新启动。这次它成功了,因为我的目标是在没有我手动干预的情况下启动服务器:)。

答案3

这已经在在 systemd 服务文件中设置 DISPLAY

如果这不起作用,我建议使用大多数桌面提供的“自动启动”功能。不过,使用systemd将是首选,因为systemd如果应用程序失败,则会重新启动应用程序,而该autostart功能则不会。

答案4

您可以使用

Requires=xdg-desktop-autostart.target

这将发生在之后graphical.target

相关内容