Ubuntu服务设置
0. systemd介绍
Linux系统的systemd是第一个运行的进程,用来创建系统的守护进程,管理整个Linux系统。systemd支持并行启动守护进程,systemd初始化整个系统所需的资源。
0.1 systemd基本命令
- systemctl
systemctl是systemd中最基本的命令,用于管理系统。常见基础用法如下。
sudo systemctl reboot # 重启系统
sudo systemctl poweroff # 关闭系统
sudo systemctl halt # CPU 停止工作
sudo systemctl suspend # 暂停系统
- systemd-analyze
systemd-analyze用于分析系统启动守护进程所耗费的时间。
0.2 Unit
systemd可以管理系统资源,不同的资源统称为Unit。
资源unit总共有12种:
- service:系统服务
- target:多个unit构成的一个组
当systemd需要管理多个units,可以通过target来帮助系统大量启动unit。target本质是一个unit组,包含了unit。
启动某个target时,systemd会启动里面所有的uint。
systemd启动的第一个target为default.target,本质是一个软连接执行multi-user.target或者graphical.target
- mount:文件系统挂载点
- automount:自动挂载点
- path:文件或路径
- scope:不是有systemd启动的外部进程
- slice:进程组
- socket:进程间通信的socket
- swap:swap文件
- timer:定时器
- device:硬件设备
unit常见管理命令如下:
systemctl start unit
systemctl stop unit
systemctl restart unit
systemctl reload unit (重新加载unit的配置文件)
systemctl kill unit (杀死unit的所有进程)
systemctl daemon-reload(重新加载所有修改过的配置文件)
1. unit配置文件
每一个unit都有一个配置文件,告诉ystemd如何启动该unit.
systemd默认从目录/etc/systemd/system/中读取配置文件。但是该目录下大部分文件都是符号链接,真正的配置文件存放在/lib/systemd/system目录下
- unit组
[Unit]区块用来定义Unit的内容,配置于其他Unit的依赖、启动顺序关系。
Description:简短描述作用 Documentation:文档地址
Requiers:当前unit依赖的其他unit,如果它们没有运行,当前unit会启动失败 Wants:与当前 Unit 配合的其他
Unit,如果它们没有运行,当前 Unit 不会启动失败 BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前
Unit 停止运行 Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动 After:如果该字段指定的
Unit 也要启动,那么必须在当前 Unit 之前启动
- [Service]区块
Type:定义启动时的进程行为。它有以下几种值。
Type=simple:默认值,执行ExecStart指定的命令,启动主进程 Type=forking:以 fork
方式从父进程创建子进程,创建后父进程会立即退出 Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动 Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行ExecStart:启动当前服务的命令 ExecStartPre:启动当前服务之前执行的命令
ExecStartPost:启动当前服务之后执行的命令 ExecReload:重启当前服务时执行的命令
ExecStop:停止当前服务时执行的命令 ExecStopPost:停止当其服务之后执行的命令
RestartSec:自动重启当前服务间隔的秒数 Restart:定义何种情况 Systemd
会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数 Environment:指定环境变量
RemainAfterExit:unit的进程退出后,unit资源保留下来 TimeoutStartSec
启动服务时的等待的秒数,如果超过这个时间服务任然没有执行完所有的启动命令,则 systemd 会认为服务自动失败。这一配置对于使用
Docker 容器托管的应用十分重要,由于 Docker 第一次运行时可以能会需要从网络下载服务的镜像文件,因此造成比较严重的延时,容易被
systemd 误判为启动失败而杀死。通常对于这种服务,需要将 TimeoutStartSec 的值指定为 0,从而关闭超时检测,如前面的第二个例子。
- [Install]区块:定义如何启动,以及是否开机启动
WantedBy:它的值是一个或多个 Target,当前 Unit
激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
RequiredBy:它的值是一个或多个 Target,当前 Unit
激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias:当前 Unit 可用于启动的别名 Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
2. 开机自启动
在[Install]区块中,定义了是否开机启动。为了能够使得服务开机自启动,需要执行如下命令激活服务
$ systemctl enable rot13
同样可以通过如下命令disable服务,取消开机自启动
$ systemctl disable rot13
3. 服务自动重启
在[Service]区块中,可以通过设置restart相关参数,使得服务自动重启
4. 查看服务状态
可以通过journalctl工具查看指定服务的输出,-u用来指定服务名称,-f指定实时输出
sudo journalctl -n -f -u baoshen.service
总结
在ubuntu中,对于开发者开发的应用想要以服务的形式开机重启,可以通过本文章找到相应的答案。本文介绍了ubuntu下服务的各种操作以及每个组区块的各种含义。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!