自定义systemd service unit
有时我们安装的某些软件需要自启动,就只能自己定义systemd 的服务单元(service unit)实现。
systemd的unit都存放在 /lib/systemd/system/ 文件夹下,如下图所示,主要关注.service unit:
每个.service文件都有固定格式,以jupyter.service为例
我们自定义的service按照格式去写即可,常用参数参考下表,所有参数参考金步国systemd手册systemd.service 中文手册 [金步国] (jinbuguo.com):
1)service unit file 通常由三部分组成: [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等; [Type]:与特定类型相关的专用选项,通常有[Service],[Socket],[Timer],[Mount],[Path]等,此处以Service类型为例; [Install]:定义unit的装载参数 2)各部分释义: [Unit] 段的常用选项: Description:描述信息; 意义性描述; After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动;其功能与Before相反; Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法启动; Wants:期望某units启动,弱依赖;本单元启动了,它“想要”的单元也会被启动。但是这个单元若启动不成功,对本单元没有影响。
BindsTo:与 Requires 相似,但是一种更强的关联。启动这个服务时会同时启动列出的所有模块,当有模块启动失败时终止当前服务。反之,只要列出的模块全部启动以后,也会自动启动当前服务。并且这些模块中有任意一个出现意外结束或重启,这个服务也会终止或重启。
Conflicts:与某些unit冲突,某些unit启动时此unit无法启动 [Service] 段的常用选项: Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型,其类型有: simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休 forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程 oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行 dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动 notify:当前服务启动完毕,会通知systemd再继续往下执行 idle:若有其他任务执行完毕,当前服务才会运行 EnvironmentFile:环境配置文件; ExecStart:指明启动unit要运行命令或脚本; ExecStartPre:在ExecStart之前运行;
ExecStartPost:在ExecStart之后运行; ExecStop:指明停止unit要运行的命令或脚本; Restart:当设定Restart=1时,则当次daemon服务意外终止后,会再次自动启动。
WorkingDirectory:指定服务的工作目录。
RootDirectory:指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。
User:指定运行服务的用户,会影响服务对本地文件系统的访问权限。
Group:指定运行服务的用户组,会影响服务对本地文件系统的访问权限。
[Install] 段的常用选项:
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖
WantedBy:被哪个target装载
自定义的unit通过 systemctl enable xxx.service 启用自动装载,实际上是通过在/etc/systemd/system/对应target.wants文件夹下创建软连接指向/lib/systemd/system/中的unit实现的,系统启动时会通过这些软连接装载服务。
/etc/systemd/system/multi-user.target.wants/jupyter.service → /lib/systemd/system/jupyter.service
ps:软连接创建在哪个target.wants文件夹下是通过在unit中的Install段下WantedBy参数决定的
[Install]
WantedBy:xxx.target