0x01什么是Systemd服务Systemd服务是一个以.service结尾的单元配置文件,它控制着一个由Systemd控制或监控的进程。简单的说就是用来在后台以守护进程的形式运行程序。Systemd广泛应用于新版本的RHEL、SUSELinuxEnterprise、CentOS、Fedora、openSUSE,以替代旧的服务管理器服务。基本命令:systemctlcommandxxx.service#其中命令可以是start、stop、restart、enable等,例如:systemctlstarthttpd.service#启动Apache服务systemctlstophttpd.service#停止Apache服务systemctlrestarthttpd.service#停止Apache服务systemctlenablemariadb.service#设置MariaDB服务启动0x02Systemd服务存放位置Systemd服务位于/etc/systemd/system(针对系统管理员和用户),/usr/lib/systemd/system(针对distributionversionpackager),我们一般使用前者。0x03写入Systemd服务Systemd服务的内容主要分为三个部分,控制单元(unit)定义,服务(service)定义,安装部分。1.定义控制单元[Unit]在Systemd中,Systemd在启动过程中需要控制的所有东西都是一个单元。基本用法如下:Description:表示对整个单元的描述,可以根据需要填写。想要:这个单位被激活,它“想要”的单位也会被激活。但如果本机启动失败,则不会影响本机。Requires:当这个单元启动时,它“需要”的单元也将被启动;如果它“需要”的单元被停止,它就不能独立存在。但请注意,此设置不控制启动顺序,因为它“需要”的单元启动需要时间。如果它“需要”的单元还没有启动,它就开始启动单元,单元不能启动。所以不推荐使用这个字段。OnFailure:如果单元启动失败,作为折衷方案启动这个单元。之前/之后:指定启动顺序。看一个实际的例子:[Unit]Description=ProtectARPlistWants=network-online.targetAfter=network.target其中network.target代表一个网络,network-online.target代表一个连接的网络。2.定义服务本体[service]定义好Systemd用来标识服务的单位之后,我们来定义服务本体。基本用法如下:Type:服务的类型,各种类型的区别如下simple:默认,这是最简单的服务类型。意思是启动的程序是主程序,如果这个程序退出,一切都会关闭。forking:标准UnixDaemon使用的启动方式。启动程序后,将调用fork()函数。建立必要的通信通道后,父进程退出,留下守护进程的子进程。oneshot:适用于那些只执行一次的任务或命令,执行完就没有踪影了。因为这类服务运行后不留痕迹,所以我们经常需要使用RemainAfterExit=yes。这意味着即使没有进程存在,Systemd也认为该服务已成功启动。同时,只有这个类型支持多条命令,使用;在命令之间拆分,如果需要换行,请使用\。dbus:本程序启动时需要获取一块DBus空间,所以需要和BusName=一起使用。只有成功获取到DBus空间,依赖它的程序才会启动。ExecStart:输入命令开始时执行的命令。这里的命令启动的程序必须使用绝对路径。例如,您必须使用/sbin/arp而不是简单地直接将arp与环境变量一起使用。ExecStop:输入命令停止时执行的命令,要求同上。ExecReload:这不是必需的。如果你不写,你的服务将不支持重启命令。ExecStart和ExecStop是必需的。看一个实际的例子:[Service]Type=oneshotRemainAfterExit=yesExecStart=/sbin/arp-f/etc/ip-macExecReload=/sbin/arp-f/etc/ip-macExecStop=/sbin/arp-d-a这里的/etc/ip-mac文件中的ARP条目在启动和重启时将被读取并添加到ARP表中,而在停止时ARP表将被清除。3、安装服务【install】服务写好后,需要systemd加载。安装单元的字段定义如下:WantedBy:设置谁来加载服务,一般设置为多用户。targetAlias:为服务设置别名,可以使用多个A名来操作服务。另外:安装该服务时需要的其他服务4.完整的SystemdService配置示例结合以上三个模块,我们可以得到一个完整的SystemdService配置示例:[Unit]Description=ProtectARPlistWants=network-online.targetAfter=network.target[服务]Type=oneshotRemainAfterExit=yesExecStart=/sbin/arp-f/etc/ip-macExecReload=/sbin/arp-f/etc/ip-macExecStop=/sbin/arp-d-a[Install]WantedBy=multi-user.target0x04总结Systemd服务是一个更好的替代/etc/init.d/下的脚本的方式,它可以灵活控制你什么时候要启动该服务,一般不会导致系统损坏无法启动进入紧急模式。所以如果你想设置开机自启动的东西,可以尝试写SystemdService。当然前提是你使用的Linux发行版支持。参考:openSUSE:Howtowriteasystemdservice
