自定义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

 

posted @ 2021-10-09 18:32  FengZhe  阅读(352)  评论(0编辑  收藏  举报