Linux系统中也有“服务”这一说法,通过服务我们可以便捷地管理一些程序功能,也可以作为程序开机自启的一个手段之一。今天我来分享一下如何创建自己简易的Linux服务。
1,新建服务文件
每一个服务在Linux有它自己的对应的配置文件,这个文件可以通过文本编辑器编辑,扩展名为xxx.servive
(xxx为服务名称)。这些文件位于/usr/lib/systemd/system
目录下。
在这个目录下新建service文件即可创建我们的服务。文件的内容结构如下:
[Unit] Description=服务描述 After=服务依赖(再这些服务后启动本服务) [Service] Type=服务类型 ExecStart=启动命令 ExecStop=终止命令 ExecReload=重启命令 [Install] WantedBy=服务安装设置
可见服务配置文件分为[Unit]
、[Service]
和[Install]
三大部分。
一般来说有些值是固定的,没有特殊需要我们直接套用即可。例如[Unit]
中After
的值一般是:network.target remote-fs.target nss-lookup.target
。
[Install]
的WantedBy
一般是multi-user.target
。
[Service]
中是主要内容。
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
了。一般来说我们的程序是应用程序前台使用就用simple
,后台/守护进程一般是forking
。
然后就是启动/停止/重启命令,注意这个命令里面调用的程序必须全部使用绝对路径。
例如,我的服务器上的redis的Service配置:
[Unit] Description=Redis-Server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/opt/Redis-6.2.1/redis-server /root/RedisData/redis-conf.conf ExecStop=kill -9 $(pidof redis-server) ExecReload=kill -9 $(pidof redis-server) && /opt/Redis-6.2.1/redis-server /root/RedisData/redis-conf.conf [Install] WantedBy=multi-user.target
因为redis一般作为后台程序运行所以Type填forking。kill -9 $(pidof redis-server)
命令的意思是:先用pidof
命令获取指定名称进程的pid再把这个结果传给kill
命令终止对应进程。平时终止特定名称的进程时也可以这么写。
其实除此之外,service文件还有很多配置项,这里只写出了常用必要的,满足日常需求,其余可以自行搜索学习,这里不再过多赘述。
2,启动/停止/重启我们的服务
刚刚建立好了我们的服务配置,现在就可以使用了!在此之前需要先使用下列命令让系统重新读取所有服务文件:
systemctl daemon-reload
然后通过以下命令操控服务:
# 启动服务service 服务名 start# 终止服务service 服务名 stop# 重启服务service 服务名 restart
那么注意服务名就是我们刚刚创建的服务配置文件service文件的文件名(不包括扩展名),例如我的服务文件是redis-server.service
,那么我的服务名是redis-server
。
其实我们执行启动服务命令时,就会执行我们刚刚配置文件中ExecStart
的值的命令,同样终止、重启会对应执行配置文件中ExecStop
、ExecReload
的值的命令。
3,启用/禁用开机自启
通过以下命令启用/禁用开机自启动:
# 启用开机自启systemctl enable 服务名 # 禁用开机自启systemctl disable 服务名