共计 2252 个字符,预计需要花费 6 分钟才能阅读完成。
Systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由 Systemd 控制或监视的进程。简单说,用于后台以守护精灵(daemon)的形式运行程序。Systemd 广泛应用于新版本的 RHEL、SUSE Linux Enterprise、CentOS、Fedora 和 openSUSE 中,用于替代旧有的服务管理器 service。
开始
Systemd 服务的内容主要分为三个部分,控制单元(unit)的定义、服务(service)的定义、以及安装部分。服务的路径位于 /etc/systemd/system
目录(系统的服务位于/usr/lib/systemd/system
),以 .service
结尾的单元(unit)配置文件,这篇文章以创建 nginx service 为例,这里假设您已经自行编译安装好了 nginx,下面我们来创建一个 nginx service
# 创建一个 nginx.service 文件
vi /etc/systemd/system/nginx.service
内容如下:
[Unit]
Description=Nginx - high performance web server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
输入命令 systemctl daemon-reload
来加载刚刚创建的 nginx 服务,这样我们就可以用 Systemd 的方式来管理 nginx 了,命令如下:
# 启动 nginx
systemctl start nginx
#重载 nginx
systemctl reload nginx
#停止 nginx
systemctl stop nginx
#重启 nginx
systemctl restart nginx
#如果需要开机启动
systemctl enable nginx
#如果需要取消开机启动
systemctl disable nginx
定义控制单元 [Unit]
从上面的例子中我们看到 Unit 内容如下:
[Unit]
Description=Nginx - high performance web server
After=network.target
- Description:代表整个单元的描述,可根据需要任意填写。
- Before/After:指定启动顺序。
- network.target 代表有网路,network-online.target 代表一个连通着的网络。
定义服务本体 [service]
上面的 Service 中服务本体内容为:
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
- Type: 服务的类型,各种类型的区别如下所示
- simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。
- forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。
- oneshot:适用于那些被一次性执行的任务或者命令,它运行完成后便了无痕迹。因为这类服务运行完就没有任何痕迹,我们经常会需要使用 RemainAfterExit=yes。意思是说,即使没有进程存在,Systemd 也认为该服务启动成功了。同时只有这种类型支持多条命令,命令之间用; 分割,如需换行可以用 \。
- dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。
- ExecStart:在输入的命令是 start 时候执行的命令,这里的命令启动的程序必须使用绝对路径,比如你必须用 /sbin/arp 而不能简单的以环境变量直接使用 arp。
- ExecStop:在输入的命令是 stop 时候执行的命令,要求同上。
- ExecReload:这个不是必需,如果不写则你的 service 就不支持 restart 命令。ExecStart 和 ExecStop 是必须要有的。
其实服务本体中还有更多的参数,这里在额外列举一些常用的参数:
- User: 指定用户运行
- Group: 指定用户组运行
- WorkingDirectory: 进程工作目录,也就是说在执行前会先切换到这个目录
安装服务 [install]
上面例子中安装服务内容为:
[Install]
WantedBy=multi-user.target
- WantedBy:设置服务被谁装载,一般设置为
multi-user.target
总结
Systemd Service 是一种替代 /etc/init.d/ 下脚本的更好方式,它可以灵活的控制你什么时候要启动服务,一般情况下也不会造成系统无法启动进入紧急模式。所以如果想设置一些开机启动的东西,可以试着写 Systemd Service。当然了,前提是你使用的 Linux 发行版是支持它的才行。
此文部分内容参考了:如何编写一个 Systemd Service