我为 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