服务
在Linux中,服务是在后台运行的程序,服务的名称最后一般带有字母 d
,例如 smbd
、httpd
、vsftpd
等因为 d
是 单词 daemon(守护进程)的首字母。
Linux下服务配置
Linux中每一个服务都有一个配置文件,一般存放在 /lib/systemd/system
目录下。
/etc/systemd/system
也有服务的配置文件,是 /lib/systemd/system
中服务的软连接,只有服务被设置为开机自启才会存在于/etc/systemd/system
这个目录中,系统开机时,systemd(服务管理器) 只会读取该目录下的配置文件。
服务配置文件介绍
服务的配置文件中分为三个区块,分别为 [Unit]
、[Service]
、[Install]
[Unit]
[Unit] 用于定义服务启动的先后顺序与其他服务的依赖关系。可设置参数如下:
Description // 表示对该服务的描述
Documentation // 服务的文档地址
Requires // 表示该服务与其他服务有依赖关系,其他服务停止运行,该服务也会停止运行
Wants // 表示该服务与其他服务存在某种弱依赖关系,其他服务停止也不会导致该服务停止
Before // 表示启动顺序,该服务必须要在其他服务之前启动
After // 表示启动顺序,该服务必须要在其他服务之后启动
Conflicts // 表示其他服务不能与该服务同时运行
[Service]
[Service] 用于指出服务的类型以及如何启动。可设置数如下:
Type: 用于指出服务的启动类型,可取的类型有:
Type=simple // 默认值,运行ExecStart字段指定的进程,也就是启动主进程
Type=forking // 以 fork() 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot // 类似于simple,但只执行一次,Systemd 会等当前服务执行完,才启动其他服务
Type=dbus // 类似于simple,但当前服务通是过D-Bus启动
Type=notify // 类似于simple,当前服务启动完毕,会通知Systemd,systemd再继续启动其他服务
Type=idle // 类似于simple,但要等其他任务执行完,当前服务才会运行
关于启动停止的命令设置
ExecStart // 指出启动主进程要执行的命令
ExecStartPre // 指出启动当前服务之前执行的命令
ExecStartPost // 指出启动当前服务之后执行的命令
ExecReload // 指出重启当前服务时执行的命令
ExecStop // 指出停止当前服务时执行的命令
ExecStopPost // 停止当其服务之后执行的命令
Restart: 定义了服务退出后,该服务的重启方式。可取得值有:
Restart=no // 默认值,退出后不重启
Restart=on-success // 只有正常退出时(退出状态码为0),才会重启
Restart=on-failure // 非正常退出时(退出状态码不为0),包括被信号终止或启动超时,才会重启
Restart=on-abnormal // 只有被信号终止和超时,才会重启
Restart=on-abort // 只有在收到没有捕捉到的信号终止时,才会重启
Restart=on-watchdog // 服务启动超时退出时,才会重启
Restart=always // 不管什么原因退出,总会重启
RestartSec // 服务重启前需要等待的秒数
TimeoutSec // 停止当前服务之前等待的秒数
环境变量
EnvironmentFile // 指定保存当前服务需要的环境变量的文件,以键值对的形式保存
可以在环境变量文件前加上 -
表示即使加载出错,或者文件不存在也不影响其他命令的执行,也不会抛出错误,例如:
EnvironmentFile=-/etc/environment
KillMode:
KillMode // 表示如何停止当前服务,可取的值有:
KillMode=control-group // 默认值,当前控制组里面的所有子进程都会被杀掉
KillMode=process // 只会杀死主进程
KillMode=mixed // 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
KillMode=none // 没有进程会被杀掉,只是服务将会被停掉
[Install]
[Install] 用来定义如何启动,以及是否开机启动,可设置参数如下:
WantedBy // 它的值是一个或多个 Target,当前服务激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
RequiredBy // 它的值是一个或多个 Target,当前服务激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias // 当前服务可用于启动的别名
Also // 当前服务激活(enable)时,会被同时激活的其他服务
实例
配置一个test.service服务
[Unit]
Description=This is a test service // 描述
After=network.target // 在network.target之后启动,一般可以设置成这个
[Service]
Type=simple // 默认值,启动主进程
User=root // 设置进程所有者为 root
Group=root // 设置进程所属组为 root
WorkingDirectory=/home/student/test/ // 工作目录
ExecStart=/home/student/test/test-exe // 主进程的绝对路径
Restart=always // 进程停止时也会自动重启
TimeoutStartSec=2s // 停止当前服务之前等待2秒
RestartSec=1 // 重启服务时需要等待1秒
[Install]
WantedBy=multi-user.target // 一般设置为 multi-user.target
Alias=testd // 别名
配置好服务的配置文件之后需要重新加载配置文件,并启动该服务
systemctl daemon-reload
sudo systemctl restart test.service
systemctl 命令的学习可参考这篇Linux基础命令的学习