编写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的方式启动,实现自动化了:
服务中的启动脚本可参考前面的文档。 |
原文: http://qtchina.tk/?q=node/749 |
Powered by zexport
|