作为一个测试 + 运维人员,经常需要使用 jenkins 做持续集成,将 jenkins 作为守护进程有很多方法,其中一个就是用 systemd。
Systemd 使用(Nginx 和 Jenkins 为例)
systemd 是什么
管理系统所有进程、服务以及启动项等的软件简称「系统管理器」
查看
2.1 查看系统所有安装的服务项
1 | systemctl list-unit-files --type=service |
使用 PageUp
或 PageDown
翻页,查看完毕后按 q
退出。
2.2 查看系统所有运行的服务项
1 | systemctl list-units --type=service |
如果看到某个服务项前面有一个红点,说明该服务存在问题,请进行排查。
使用 PageUp
或 PageDown
翻页,查看完毕后按 q
退出。
2.3 查看系统所有开机自启动的服务项
1 | systemctl list-unit-files --type=service | grep enabled |
2.4 查看指定服务项状态
1 | systemctl status <服务项名称> |
执行命令之后,系统会显示该服务项的状态、是否已激活、描述以及最后十条日志。
如果服务项前面有一个红点,说明该服务存在问题,请根据日志进行排查。
例如
查看 Nginx 服务状态
1 | [root: ~]# systemctl status nginx.service |
2.6 查看出错的服务
1 | systemctl list-units --type=service --state=failed |
管理服务
3.1 启动服务
1 | systemctl start <服务项名称> |
3.2 停止服务
1 | systemctl stop <服务项名称> |
3.3 重启服务
1 | systemctl restart <服务项名称> |
3.4 重新读取配置文件
如果该服务不能重启,但又必须使用新的配置,这条命令会很有用。
1 | systemctl reload <服务项名称> |
3.5 使服务开机自启动
1 | systemctl enable <服务项名称> |
3.6 使服务不要开机自启动
1 | systemctl disable <服务项名称> |
创建服务
4.1 服务文件的位置
CentOS 7 的服务 systemctl 脚本存放在:/usr/lib/systemd/,有系统 system 和用户 user 之分。
1 | /lib/systemd/system |
在 /etc/systemd/system
下面创建 nginx.service.d
目录,在这个目录里面新建任何以.conf 结尾的文件,然后写入我们自己的配置。
4.2 服务文件的模版
每一个服务以.service 结尾,一般会分为 3 部分:[Unit]、[Service] 和 [Install],就以 nginx 为例吧,具体内容如下:
1 | [Unit] |
配置项说明
下面分别解释下着三部分的含义
[Unit]
- Description : 服务的简单描述
- Documentation : 服务文档
- After= : 依赖,仅当依赖的服务启动之后再启动自定义的服务单元
[Service]
- Type : 启动类型 simple、forking、oneshot、notify、dbus
- Type=simple(默认值):systemd 认为该服务将立即启动,服务进程不会 fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是 socket 激活型
- Type=forking:systemd 认为当该服务进程 fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求, 使用此类型启动即可。使用此启动类型应同时指定
PIDFile=
,以便 systemd 能够跟踪服务的主进程。 - Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置
RemainAfterExit=yes
使得systemd
在服务进程退出之后仍然认为服务处于激活状态。 - Type=notify:与
Type=simple
相同,但约定服务会在就绪后向systemd
发送一个信号,这一通知的实现由libsystemd-daemon.so
提供 - Type=dbus:若以此方式启动,当指定的 BusName 出现在 DBus 系统总线上时,systemd 认为服务就绪。
- PIDFile : pid 文件路径
- ExecStartPre :启动前要做什么,上文中是测试配置文件 -t
- ExecStart:启动
- ExecReload:重载
- ExecStop:停止
- PrivateTmp:True 表示给服务分配独立的临时空间
[Install]
- WantedBy:服务安装的用户模式,从字面上看,就是想要使用这个服务的有是谁?上文中使用的是:
multi-user.target
,就是指想要使用这个服务的目录是多用户。每一个.target 实际上是链接到我们单位文件的集合,当我们执行 systemctl enable nginx.service
就会在 /etc/systemd/system/multi-user.target.wants/
目录下新建一个 /usr/lib/systemd/system/nginx.service
文件的链接。
Jenkins 实例
创建 service
1 | sudo vim /etc/systemd/system/jenkins.service |
1 | [Unit] |
应用与生效
1 | sudo systemctl daemon-reload |