服务注销后也能自启的改造过程-(Linux服务)

背景

之前手动编写了一个X11VNC的服务,方便远程连接我的linux桌面环境,但发现每次注销后这个vnc服务就停掉了,没有自己起来,只有重启开机才能正常启动,于是就想着需要改造一下。

原版服务内容

[Unit]
Description=Remote desktop service (VNC)
Requires=display-manager.service
After=display-manager.service

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth guess -forever -rfbauth /etc/x11vnc.pass -rfbport 5900 -shared
ExecStop=/usr/bin/killall x11vnc

[Install]
WantedBy=multi-user.target

但上面这个服务是没法在注销后重启服务的。

改造版本

[Unit]
Description=Remote desktop service (VNC)
Requires=display-manager.service
After=display-manager.service

[Service]
Type=simple  # 改成forking会非常不稳定,会自己断开不知道什么原因
ExecStart=/usr/bin/x11vnc -auth guess -forever -rfbauth /etc/x11vnc.pass -rfbport 5900 -shared
ExecStop=/usr/bin/killall x11vnc
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

这里主要做了两个更改:

  • 将服务类型(Type)从 “simple” 改为 “forking”。这样,服务将作为一个守护进程运行,并且 systemd 将等待该进程创建子进程后认为服务已经启动完成。
    这个地方将Type改成forking后发现非常不稳定,最后换回simple发现同样可以实现注销后自启。

  • 添加了两行新设置:

Restart=always:这将指示 systemd 在服务意外退出时自动重新启动它。
RestartSec=3:这将设置在重新启动服务之前等待的时间间隔(以秒为单位)。在这个例子中,设置为 3 秒。
保存更改后,重新加载 systemd 配置并重新启动服务:

通过日志验证注销后的重启

journalctl -fu x11vnc.service

上述命令可以查看服务的实时日志信息。

  • -f 是实时查看日志的参数
  • -u 后面接服务名称,就是查看该服务的日志信息

通过下面的日志可以看到注销后服务能正常自启了

deepin@deepin-PC:~$ sudo journalctl -fu x11vnc.service
Verify your face or password:
验证成功
Apr 24 11:43:15 deepin-PC x11vnc[11194]: 24/04/2024 11:43:15
Apr 24 11:43:15 deepin-PC x11vnc[11194]: The VNC desktop is:      deepin-PC:0
Apr 24 11:43:15 deepin-PC x11vnc[11194]: PORT=5900
Apr 24 11:43:15 deepin-PC x11vnc[11194]: ******************************************************************************
Apr 24 11:43:15 deepin-PC x11vnc[11194]: Have you tried the x11vnc '-ncache' VNC client-side pixel caching feature yet?
Apr 24 11:43:15 deepin-PC x11vnc[11194]: The scheme stores pixel data offscreen on the VNC viewer side for faster
Apr 24 11:43:15 deepin-PC x11vnc[11194]: retrieval.  It should work with any VNC viewer.  Try it by running:
Apr 24 11:43:15 deepin-PC x11vnc[11194]:     x11vnc -ncache 10 ...
Apr 24 11:43:15 deepin-PC x11vnc[11194]: One can also add -ncache_cr for smooth 'copyrect' window motion.
Apr 24 11:43:15 deepin-PC x11vnc[11194]: More info: http://www.karlrunge.com/x11vnc/faq.html#faq-client-caching
Apr 24 11:44:37 deepin-PC x11vnc[11194]: caught XIO error:
Apr 24 11:44:37 deepin-PC x11vnc[11194]: 24/04/2024 11:44:37 deleted 79 tile_row polling images.
Apr 24 11:44:37 deepin-PC systemd[1]: x11vnc.service: Control process exited, code=exited, status=3/NOTIMPLEMENTED
Apr 24 11:44:37 deepin-PC systemd[1]: x11vnc.service: Failed with result 'exit-code'.
Apr 24 11:44:37 deepin-PC systemd[1]: Failed to start x11vnc.service - Remote desktop service (VNC).
Apr 24 11:44:40 deepin-PC systemd[1]: x11vnc.service: Scheduled restart job, restart counter is at 19.
Apr 24 11:44:40 deepin-PC systemd[1]: Starting x11vnc.service - Remote desktop service (VNC)...
Apr 24 11:44:40 deepin-PC x11vnc[11895]: 24/04/2024 11:44:40 passing arg to libvncserver: -rfbauth
Apr 24 11:44:40 deepin-PC x11vnc[11895]: 24/04/2024 11:44:40 passing arg to libvncserver: /etc/x11vnc.pass
Apr 24 11:44:40 deepin-PC x11vnc[11895]: 24/04/2024 11:44:40 passing arg to libvncserver: -rfbport
Apr 24 11:44:40 deepin-PC x11vnc[11895]: 24/04/2024 11:44:40 passing arg to libvncserver: 5900
Apr 24 11:44:40 deepin-PC x11vnc[11895]: 24/04/2024 11:44:40 x11vnc version: 0.9.16 lastmod: 2019-01-05  pid: 11895
Apr 24 11:44:40 deepin-PC x11vnc[11939]: xauth:  unable to generate an authority file name
……

服务类型简洁

在 Systemd 中,Type 字段用于指定服务的类型。以下是几种常见的 Type 类型及其作用:

  • simple:这是最常见的类型,指示服务以非分叉方式启动。当服务启动后,Systemd 将等待其退出状态,并将其视为运行中的服务。适用于不会派生子进程的简单服务,例如网络服务或后台守护进程。

  • forking:此类型表示服务在启动时会派生出一个或多个子进程。Systemd 会等待主进程退出,并认为服务已启动。适用于需要派生子进程的服务,例如某些 Web 服务器或其他需要在后台运行的守护进程。

  • oneshot:这种类型的服务只会在启动时执行一次特定的任务,然后立即退出。适用于需要运行一次性任务的服务,例如系统初始化脚本或配置脚本。

  • dbus:此类型用于通过 D-Bus 激活的服务。D-Bus 是一种进程间通信机制,服务可以通过 D-Bus 接收请求并执行相应的操作。

  • notify:服务会在启动完成后向 Systemd 发送一个通知,以指示其已准备就绪。适用于需要向 Systemd 报告状态的服务。

选择适当的 Type 取决于服务的性质和需求。大多数情况下,simple 是最常用的类型,适用于大多数常规服务。如果服务需要派生子进程或需要向 Systemd 报告状态,可以选择其他类型。

请注意,不同的 Type 类型可能需要在服务的 Unit 文件中进行其他配置。您可以查阅 Systemd 的文档以获取更详细的信息和配置选项。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值