编写systemd的服务unit

发布: 2014-05-30 12:04

systemd在桌面系统上越来越流行了,它用来取代之后的sysvinit启动脚本,提高桌面的启动速度。
最近用archlinux的时候,已经删除了sysvinit包,像常用的rc.local已经就不支持了,
以前许多的指启动功能需要移植到systemd的service上来。

本次测试只实现了rc.local的功能,使用了systemd一小部分子集,
并没有用到systemd的所有功能,如果需要更深入的学习systemd unit service的编写,请查阅systemd说明文档。
http://www.freedesktop.org/software/systemd/man/systemd.service.html

systemd unit 脚本是一种类ini格式的文件,按描述信息、执行、安装等分为多个section,
每个section多条name=value行,现就就最基本的section和name做下描述:
section: Unit, Service, Install

Unit section基本name:
Description= 服务的描述
Wants= 服务的依赖目标,如network.target
Before= 前置依赖目标,如network.target
After= 必须在某个启动目标之后

Service section基本的name:
Type=oneshot | forking | dbus oneshot针对简单的多行独立的命令,forking针对复杂的脚本
并且在希望执行多个独立的命令的时候,使用使用oneshot方式,否则systemctl报错。
User= 启动该服务的用户如,root,nobody,ftp。默认使用root用户启动。
ExecStart= 启动该服务的命令行,可通过使用Type=oneshot出现多次,但其中的命令行必须使用绝对路径。
ExecStop= 关闭该服务的命令行,可通过使用Type=oneshot出现多次,但其中的命令行必须使用绝对路径。

Install section的基本name:
WantedBy=multi-user.target 一般都是这个启动级别
Alias= 定义这个服务的别名

注意,systemd unit文件中,name一定是大定字母开关。

我的rc.local.service示例:
[code type="ini"]
[Unit]
Description=Old sysvinit rc.local service
Wants=
Before=
After=

[Service]
Type=forking
User=root
ExecStart=/usr/bin/bash /etc/rc.local.systemd start
ExecStop=/usr/bin/true

[Install]
WantedBy=multi-user.target
[/code]

这个文件存为/etc/systemd/system/rc.local.service,在用systemctl status rc.local是可查看状态。
脚本的rc.local.systemd只是原来的rc.local改了个名字。

另外常用的systemctl命令:
systemctl 不带参数,查看所有的系统自带的service和targets.
systemctl --system daemon-reload 重新加载修改过后unit。
systemctl enable rc.local.service 把该服务安装到启动目标。
systemctl start rc.local
systemctl stop rc.local
systemctl status rc.local

在实现了简单的service后,甚至可以实现更复杂的服务unit。
例如,前面写的启动最小化linux桌面环境的脚本,也可以用systemd的方式启动,实现自动化了:

[Unit]
Description=test custom unit

[Service]
Type=forking
User=gzleo
ExecStart=/home/gzleo/myscripts-svn/start_mini_x.sh
ExecStop=/usr/bin/killall -9 X

[Install]
WantedBy=multi-user.target
Alias=minidesk


服务中的启动脚本可参考前面的文档。



原文: http://qtchina.tk/?q=node/749

Powered by zexport