service(服务)和程序开机自启是两个东西。服务可以设置为开机自启,服务一直运行在后台,我们希望的是它可以提供一个服务功能。程序可以设置为开机自启,只要程序开机运行即可,至于运行后程序可以存在也可以退出。
下面是linux和windows中服务的编写与设置,以及程序的开机启动设置。
在linux中,使用systemd进行服务单元的配置。配置方法可见Systemd 入门教程:实战篇。
写配置文件,有时候会写错。严重的错误是无法启动,可以使用systemd-analyze
分析下,可参考What does “Failed to execute operation: Invalid argument” mean when running systemctl enable?
能运行,有时候并没有正常运行。可以通过journalctl
查看日志,进行排查,可参考journalctl:查询 systemd 日志、如何查看systemctl启动服务的日志。
这里有个详细到啰嗦的教程:使用用systemd处理你的守护进程
注意,通过systemd启动的守护进程,不需要写成守护进行的形式,只需要选择type=simple
即可。如果写成守护进行形式,需要type=fork
。
我写过一个server.service
[Unit]
Description=A server daemon for testing
[Service]
ExecStart=/usr/local/bin/server
ExecStop=/bin/kill -TERM $MAINPID
Type=simple
[Install]
WantedBy=multi-user.target
将一个可执行程序安装作为服务。安装的具体操作可参考用命令行加载驱动
# 比如下面加载一个驱动的命令
sc.exe create domain_block binpath=C:\Users\xxx\Desktop\block.sys type=kernel start=demand error=normal
sc.exe start domain_block
sc.exe stop domain_block
sc.exe delete domain_block
如果需要自己编写服务程序,可以参考:windows服务编程
如果只需要设置当前用户,将desktop文件,放入.config/autostart
即可。如果是设置所有用户,放入/etc/xdg/autostart
即可。
最后的方法是,去github看一个客户端应用的开机代码,看它们是如何做到跨平台的。参考应用:略。
主要是依靠注册表。如果是普通用户,可以参考:在 Windows 10 中添加在启动时自动运行的应用、Windows设置开机自启动的三种方式
如果是程序员,则可以调用注册表的C接口,Windows自启动技术-注册表。如果是在脚本中,可调用reg命令,可参考:使用Windows命令行reg控制注册表键值
本质都是给下面的注册表项添加项。
# 64位
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce