继上次针对我司IAC-IMX8MP-Kit Yocto系统上Systemd的简介,这篇文章主要分析一下关于Service的一些关键属性,帮助大家更好的了解Systemd最重要的单元,更好的控制自己的服务。

这里以一个客户的具体需求为例:自启动Qt应用,能够尽快的启动。这里贴上完整的service属性,依据对应属性详细分析,如下图所示:

总共分为三个单元,Unit、Service、Install。其中Unit单元的Description属性是对服务的描述,主要显示在服务启动时的表述,如下图所示。
After属性主要是为了限制当前服务地启动顺序,这也是相比较传统init.d启动的优势之一,需求是自启动Qt,那么需要在服务框架之后启动,所以在weston.service之后。
Service单元是我们任务的执行单元,默认给予了很多属性可以配置,这里我们主要看一下第一张图中的几个属性,Environment属性是给予任务执行时附加的环境变量,这里为了让Qt成功运行,附加了XDG的运行目录和QT的运行平台,而Type属性是任务的启动方式,目前有oneshot、simple、forking三种,这里比较重要,单独介绍。
Oneshot适用于一次性完成的配置、设置的属性等,systemd会始终阻塞等待相应动作的完成,判断服务启动成功。如果在这里用来启动一个常驻的应用,那么启动的应用将会一直阻塞在那里,systemd会认为该服务一直在启动中,在等待一定时间后(往往是90s)会结束掉这个服务,服务启动失败。
Simple是最常用的配置,会正常启动进程,并且启动的应用会被自动放入后台常驻,非常适用于启动某些后台检测脚本以及应用程序等,但这里也要注意的是,当它启动的是一个脚本时,systemd的监控是针对脚本进程的,而对于其中的应用程序等则可能忽略掉相关信息,这里推荐是使用exec命令启动程序。
Forking属于老旧的配置,目前只有极少数服务采用这种配置。Forking适用于多进程的程序,当启动的父进程退出,子进程完全启动的时候,systemd认为服务启动成功。所以它并不适合用作在脚本里启动一个常驻进程。当它启动一个脚本,那么脚本将作为主进程,脚本里启动的常驻应用将作为子进程启动,而该子进程因为是常驻应用,将会阻塞父进程退出,导致systemd认为该服务一直在启动中,超过一定时间(往往是90s)后,会自动结束该服务,导致应用启动失败。
接下来是ExecStart属性,该属性主要用于执行动作,用于执行后面的应用程序,脚本等,需要注意的是,应用程序需要绝对路径启动,而脚本是新的脚本解释器去运行,注意环境变量,以及相关脚本变量。
最后是Install单元,该单元主要是跟开机自启动有关系,其中WantedBy属性简单来说便是依赖,当用户执行systemctl enable xxx.service的时候,systemd会自动创建软链接到WantedBy的指定目标单元下,意味着该服务会随着目标单元激活而自动启动。像第一张图中的multi-user.target,意味着当系统进入多用户模式时,该服务会自动启动。
全部0条评论
快来发表一下你的评论吧 !