Linux创建Systemctl服务
文件目录:/etc/systemd/system
Linux系统中也有“服务”这一说法,通过服务我们可以便捷地管理一些程序功能,也可以作为程序开机自启的一个手段之一。今天我来分享一下如何创建自己简易的Linux服务。
1、新建服务文件
1.1、文件格式
每一个服务在Linux有它自己的对应的配置文件,这个文件可以通过文本编辑器编辑,扩展名为xxx.servive(xxx为服务名称)。这些文件位于/usr/lib/systemd/system目录下。
在这个目录下新建service文件即可创建我们的服务。文件的内容结构如下:
[Unit] |
可见服务配置文件分为[Unit]、[Service]和[Install]三大部分。一般来说有些值是固定的,没有特殊需要我们直接套用即可。例如[Unit]中After的值一般是:
network.target
:网络服务remote-fs.target
:系统挂载服务nss-lookup.target
:主句域名查找服务multi-user.target
:表示多用户命令行状态,Linux系统启动后即处于该默认target的状态。
- [Unit] 区块:启动顺序与依赖关系
- Description字段:给出当前服务的简单描述。
- Documentation字段:给出文档位置。
- After字段:如果network.target或sshd-keygen.service需要启动,那么sshd.service应该在它们之后启动。
- Before字段:定义sshd.service应该在哪些服务之前启动。
注:After和Before字段只涉及启动顺序,不涉及依赖关系。
- [Service] 区块:启动行为
- ExecStart字段:定义启动进程时执行的命令
- ExecReload字段:重启服务时执行的命令
- ExecStop字段:停止服务时执行的命令
- ExecStartPre字段:启动服务之前执行的命令
- ExecStartPost字段:启动服务之后执行的命令
- ExecStopPost字段:停止服务之后执行的命令
- Type字段:
- simple:这是默认的值,指定了ExecStart设置后,simple就是默认的Type设置除非指定Type。simple使用ExecStart创建的进程作为服务的主进程,在此设置下systemd会立即启动服务。
- forking:如果使用了这个值,则ExecStart的脚本启动后会调用fork()函数创建一个进程作为其启动的一部分。当初始化完成,父进程会退出。子进程会继续作为主进程执行。
- oneshot:类似simple,但是在systemd启动之前,进程就会退出。这是一次性的行为。可能还需要设置RemainAfterExit=yes,以便systemd认为j进程退出后仍然处于激活状态。
- dbus:也和simple很相似,该配置期待或设置一个name值,通过设置BusName=设置name即可。
- notify:同样地,与simple相似的配置。顾名思义,该设置会在守护进程启动的时候发送推送消息。
注:
- 启动/停止/重启命令,注意这个命令里面调用的程序必须全部使用绝对路径。
- 一般来说我们的程序是应用程序前台使用就用simple,后台/守护进程一般是forking。
- [Install] 区块 :定义如何安装这个配置文件,即怎样做到开机启动。
- WantedBy字段:表示该服务所在的 Target。
- Target的含义是服务组,表示一组服务。
- WantedBy=multi-user.target指的是:sshd 所在的 Target 是multi-user.target,这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
- [Install]的
WantedBy
一般是multi-user.target
- 所有的启动设置之前,都可以加上一个连词号(-),表示”抑制错误”,即发生错误的时候,不影响其他命令的执行。比如
EnvironmentFile=-/etc/sysconfig/sshd
(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd
文件不存在,也不会抛出错误。
另外:Systemd 有默认的启动 Target。
# 输出multi-user.target |
上面的结果表示,默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因。
1.2、示例
例如redis的Service配置:
[Unit] |
因为redis一般作为后台程序运行所以Type填forking。kill -9 $(pidof redis-server)命令的意思是:先用pidof命令获取指定名称进程的pid再把这个结果传给kill命令终止对应进程。平时终止特定名称的进程时也可以这么写。 或者ExecStop=/bin/kill -INT $MAINPID
2,启动/停止/重启我们的服务
刚刚建立好了我们的服务配置,现在就可以使用了!在此之前需要先使用下列命令让系统重新读取所有服务文件:
systemctl daemon-reload |
然后通过以下命令操控服务:
# 启动服务 |
那么注意服务名就是我们刚刚创建的服务配置文件service文件的文件名(不包括扩展名),例如我的服务文件是redis-server.service,那么我的服务名是redis-server。
其实我们执行启动服务命令时,就会执行我们刚刚配置文件中ExecStart的值的命令,同样终止、重启会对应执行配置文件中ExecStop、ExecReload的值的命令。
3,启用/禁用开机自启
通过以下命令启用/禁用开机自启动:
# 启用开机自启 |