Ubuntu Systemd Service开机自启服务

基本命令

启动一个服务:systemctl start blog-local.service
关闭一个服务:systemctl stop blog-local.service
重启一个服务:systemctl restart blog-local.service
显示一个服务的状态:systemctl status blog-local.service
在开机时启用一个服务:systemctl enable blog-local.service
在开机时禁用一个服务:systemctl disable blog-local.service
查看服务是否开机启动:systemctl is-enabled blog-local.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed

存放路径

/etc/systemd/system 供系统管理员和用户使用(一般使用此路径)
/usr/lib/systemd/system 供发行版打包者使用

定义控制单元 [Unit]

指令 说明
Description 服务的简单描述,可根据需求任意填写
Documentation 服务的文档路径
Requires 这个服务启动了,它需要的服务也会被启动;它需要的服务被停止了,这个服务也停止了
Wants 这个服务启动了,它需要的服务也会被启动;它需要的服务被停止了,对本服务没有影响
Requisite 这个服务启动了,它需要的服务也会被启动;需要的服务启动不成功,那本服务文件不管能不能检测等不能等待都立刻就会失败
Before/After 定义启动顺序;在xxx.service启动之前或之后启动
OnFailure 如果本服务启动失败了,那么需要启动什么服务
BindsTo 绑定两个服务,两服务的状态保证一致。如服务1为active,则本服务也一定为active
PartOf 定义了单向的依赖关系,且只对stop和restart操作有效。当被依赖服务执行stop或restart操作时,本服务也会执行操作,但本服务执行这些操作,不会影响被依赖服务
Conflicts 定义冲突的服务,本服务和被冲突服务的状态必须相反。当本服务要启动时,将会停止目标服务,当启动目标服务时,将会停止本服务

安装服务 [install]

指令 说明
Also 指出和服务一起安装或者被协助的服务
Alias 指定创建软链接时链接至本服务配置文件的别名文件
WantedBy 服务被允许运行需要的弱依赖性服务,在被依赖目标的.wants目录下创建本服务的软链接
RequiredBy 服务被允许运行需要的弱依赖性服务,在被依赖目标的.requires目录下创建本服务的软链接

定义服务本体 [service]

指令 说明
Type=simple (默认值)只适合在shell下运行的前台命令,否则systemd默认会立刻杀掉所有属于服务的进程
Type=forking 要求服务是以daemon模式运行的,需要指定PIDFile文件路径,否则会查找本服务的leader进程PID但是不靠谱(建议指定PIDFile)
Type=oneshot 适用于只执行一项任务、随后立即退出的服务;结合RemainAfterExit=yes指令,用户可以通过服务状态判断服务是否运行成功
ExecStart 指定启动服务的命令或者脚本
ExecStartPre/ExecStartPost 指定在ExecStart之前或者之后用户自定义执行的脚本
ExecReload 指定服务重启时执行的命令或者脚本
ExecStop 指定服务停止时执行的命令或者脚本
PrivateTmp 是否给服务分配独立的临时空间
PIDFile 指定PID文件路径;PIDFile只适合在Type=forking模式下使用,其它时候没必要使用;PIDFile指令的值要和服务程序的PID文件路径保持一致

创建service文件

vim /etc/systemd/system/blog-local.service

service文件示例

[Unit]
Description=web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/openresty/nginx/logs/nginx.pid
ExecStartPre=nginx -t
ExecStart=nginx -p /home/ubuntu/code/www/blog_server
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

设置开机自启

#会在/etc/systemd/system/multi-user.target.wants/目录下创建service文件软连接
systemctl enable blog-local.service