基本上, systemd 这个启动服务的机制,主要是通过一只名为 systemctl 的指令来处理的!
跟以前 systemV 需要 service / chkconfig / setup / init 等指令来协助不同, systemd 就是仅有
systemctl 这个指令来处理而已
管理单一服务
# systemctl [command] [unit] command 主要有: start :立刻启动后面接的 unit stop :立刻关闭后面接的 unit restart :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思 reload :不关闭后面接的 unit 的情况下,重新载入配置文件,让设置生效 enable :设置下次开机时,后面接的 unit 会被启动 disable :设置下次开机时,后面接的 unit 不会被启动 status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机默认执行否、登录等信息等! is-active :目前有没有正在运行中 is-enable :开机时有没有默认要启用这个 unit
一般来说,服务的启动有两个阶段,一个是“开机的时候设置要不要启动这个服务”, 以及“你
现在要不要启动这个服务”,这两者之间是不同的!举个例子来说,假如我们现在要“立刻取消
stf-api这个服务”时,正规的方法 (不要用 kill) 要怎么处理
1. 先要查看该服务的状态
# Loaded:这行在说明,开机的时候这个 unit 会不会启动,enabled 为开机启动,disabled 开机不会启动 # Active:现在这个 unit 的状态是正在执行 (running) 或没有执行 (dead) # 后面几行则是说明这个 unit 程序的 PID 状态以及最后一行显示这个服务的登录文件信息!
stop 该服务,然后查看状态

观察系统上所有的服务
systemctl [command] [--type=TYPE] [--all] command: list-units :依据 unit 列出目前有启动的 unit。若加上 --all 才会列出没启动的。 list-unit-files :依据 /usr/lib/systemd/system/ 内的文件,将所有文件列表说明。 --type=TYPE:就是之前提到的 unit type,主要有 service, socket, target 等
管理不同的操作环境 (target unit)
[ming@bogon ~]$ systemctl list-units --type=target --all UNIT LOAD ACTIVE SUB DESCRIPTION all.target not-found inactive dead all.target basic.target loaded active active Basic System cryptsetup.target loaded active active Local Encrypted Volumes dbus.target not-found inactive dead dbus.target emergency.target loaded inactive dead Emergency Mode final.target loaded inactive dead Final Step getty-pre.target loaded active active Login Prompts (Pre) getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded active active Network (Pre) network.target loaded active active Network nfs-client.target loaded active active NFS client services nss-lookup.target loaded inactive dead Host and Network Name Lookups nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths remote-fs-pre.target loaded active active Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rescue.target loaded inactive dead Rescue Mode rpc_pipefs.target loaded active active rpc_pipefs.target shutdown.target loaded inactive dead Shutdown slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization syslog.target not-found inactive dead syslog.target time-sync.target loaded inactive dead System Time Synchronized timers.target loaded active active Timers umount.target loaded inactive dead Unmount All Filesystems
而跟操作界面相关性比较高的 target 主要有下面几个:
graphical.target:就是文字加上图形界面,这个项目已经包含了下面的 multi-user.target 项目!
multi-user.target:纯文本模式!
rescue.target:在无法使用 root 登陆的情况下,systemd 在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。 但是这是额外系统,因此可能需要动到 chroot 的方式来取得你原有的系统喔!再后续的章节我们再来谈!
emergency.target:紧急处理系统的错误,还是需要使用 root 登陆的情况,在无法使用 rescue.target 时,可以尝试使用这种模式!
shutdown.target:就是关机的流程。
getty.target:可以设置你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个东西的配置文件!
正常的模式是 multi-user.target 以及 graphical.target 两个,救援方面的模式主要是 rescue.target 以及更严重的 emergency.target。 如果要修改可提供登陆的 tty 数量,则修改 getty.target 项目。基本上,我们最常使用的当然就是 multi-user 以及 graphical
systemctl [command] [unit.target] 选项与参数: command: get-default :取得目前的 target set-default :设置后面接的 target 成为默认的操作模式 isolate :切换到后面接的模式 范例一:我们的测试机器默认是图形界面,先观察是否真为图形模式,再将默认模式转为文字界面 [root@bogon ming]# systemctl get-default graphical.target # 果然是图形界面喔! [root@bogon ming]# systemctl set-default multi-user.target [root@bogon ming]# systemctl get-default multi-user.target 范例二:在不重新开机的情况下,将目前的操作环境改为纯文本模式,关掉图形界面 [root@bogon ming]# systemctl isolate multi-user.target 范例三:若需要重新取得图形界面呢? [root@bogon ming]# systemctl isolate graphical.target
分析各服务之间的相依性
systemctl list-dependencies [unit] [--reverse] 选项与参数: --reverse :反向追踪谁使用这个 unit 的意思!
[root@bogon ming]# systemctl list-dependencies rethinkdb.service --reverse rethinkdb.service ● ├─docker.service ● ├─stf-api.service ● ├─stf-app.service ● ├─stf-migrate.service ● ├─stf-processor.service ● ├─stf-reaper.service ● └─stf-websocket.service
自定义服务
服务的管理是通过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内
读懂配置文件
# /usr/lib/systemd/system/docker.service.wants/mynginx.service [Unit] Description=STF nginx public load balancer After=docker.service Requires=docker.service ConditionPathExists=/opt/conf/nginx.conf [Service] EnvironmentFile=/etc/environment TimeoutStartSec=0 Restart=always ExecStartPre=/usr/bin/docker pull nginx:1.7.10 ExecStartPre=-/usr/bin/docker kill %p ExecStartPre=-/usr/bin/docker rm %p ExecStart=/usr/bin/docker run --rm \ --name %p \ --net host \ -v /opt/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ nginx:1.7.10 \ nginx ExecStop=/usr/bin/docker stop -t 2 %p
[Unit] :启动顺序与依赖关系
上面例子表示:mynignx.service 必须在docker.service启动后才能启动(requires),同时也必须指定的文件nginx.conf是存在的
[Unit] 部份 | |
---|---|
设置参数 | 参数意义说明 |
Description | 就是当我们使用 systemctl list-units 时,会输出给管理员看的简易说明!当然,使用 systemctl status 输出的此服务的说明,也是这个项目! |
Documentation | 这个项目在提供管理员能够进行进一步的文件查询的功能! |
After | 说明此 unit 是在哪个 daemon 启动之后才启动的意思!基本上仅是说明服务启动的顺序而已,并没有强制要求里头的服务一定要启动后此 unit 才能启动。 以 sshd.service 的内容为例,该文件提到 After 后面有 network.target 以及 sshd-keygen.service,但是若这两个 unit 没有启动而强制启动 sshd.service 的话, 那么 sshd.service 应该还是能够启动的!这与 Requires 的设置是有差异的喔! |
Before | 与 After 的意义相反,是在什么服务启动前最好启动这个服务的意思。不过这仅是规范服务启动的顺序,并非强制要求的意思。 |
Requires | 明确的定义此 unit 需要在哪个 服务启动后才能够启动!就是设置相依服务啦!如果在此项设置的前导服务没有启动,那么此 unit 就不会被启动! |
Wants | 与 Requires 刚好相反,规范的是这个 unit 之后最好还要启动什么服务比较好的意思!不过,并没有明确的规范就是了!主要的目的是希望创建让使用者比较好操作的环境。 因此,这个 Wants 后面接的服务如果没有启动,其实不会影响到这个 unit 本身! |
Conflicts | 代表冲突的服务!亦即这个项目后面接的服务如果有启动,那么我们这个 unit 本身就不能启动!我们 unit 有启动,则此项目后的服务就不能启动! 反正就是冲突性的检查啦! |
[Service]
上面的例子表示: 启动新的mynginx container前, 先要pull 指定的镜像,然后stop 正在运行的同名mynginx container, 然后删除rm mynginx. 如果此服务被退出,总是会自动重启。另外也指定了环境变量所在定义的文件“etc/environment"
[Service] 部份 | ||
---|---|---|
设置参数 | 参数意义说明 | |
Type | 说明这个 service 启动的方式,会影响到 ExecStart 。一般来说,有下面几种类型 simple:默认值,主要由 ExecStart 接的指令串来启动,启动后常驻于内存中。forking:由 ExecStart 启动的程序通过 spawns 延伸出其他子程序来作为此 daemon 的主要服务。原生的父程序在启动结束后就会终止运行。 传统的 unit 服务大多属于这种项目,例如 httpd 这个 WWW 服务,当 httpd 的程序因为运行过久因此即将终结了,则 systemd 会再重新生出另一个子程序持续运行后, 再将父程序删除。据说这样的性能比较好!!oneshot:与 simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中。dbus:与 simple 类似,但这个 daemon 必须要在取得一个 D-Bus 的名称后,才会继续运行!因此设置这个项目时,通常也要设置 BusName= 才行!idle:与 simple 类似,意思是,要执行这个 service 必须要所有的工作都顺利执行完毕后才会执行。这类的 service 通常是开机到最后才执行即可的服务!比较重要的是 simple, forking 与 oneshot 了!毕竟很多服务需要子程序 (forking),而有更多的动作只需要在开机的时候执行一次(oneshot),例如文件系统的检查与挂载啊等等的。 | |
EnvironmentFile | 可以指定启动脚本的环境配置文件,指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用${key}的形式,在当前配置文件中获取。 | |
ExecStart | 就是实际执行此 service 的指令或脚本程序。你也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 两个设置项目来在实际启动服务前,进行额外的指令行为。 但是你得要特别注意的是,指令串仅接受“指令 参数 参数...”的格式,不能接受 <, >, >>, \ | , & 等特殊字符,很多的 bash 语法也不支持! 所以,要使用这些特殊的字符时,最好直接写入到指令脚本里面去 |
ExecStop | 停止服务时执行的命令 | |
ExecReload | 重启服务时执行的命令 | |
Restart | 服务退出后,Systemd 的重启方式 no(默认值):退出后不会重启. on-success:只有正常退出时(退出状态码为0),才会重启on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启on-abnormal:只有被信号终止和超时,才会重启on-abort:只有在收到没有捕捉到的信号终止时,才会重启on-watchdog:超时退出,才会重启always:不管是什么退出原因,总是重启 | |
RemainAfterExit | 当设置为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很有帮助! | |
TimeoutSec | 若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利“正常启动或正常结束”的情况下,则我们要等多久才进入“强制结束”的状态! | |
KillMode | 定义 Systemd 如何停止 服务.可以是 process, control-group, none, mix的其中一种,如果是 process 则 daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 时, 则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭。mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号 | |
RestartSec | 表示 Systemd 重启服务之前,需要等待的秒数 |
[Install ]
[Install] 部份 | |
---|---|
设置参数 | 参数意义说明 |
WantedBy | 这个设置后面接的大部分是 *.target unit !意思是,这个 unit 本身是附挂在哪一个 target unit 下面的!一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 下面! |
Also | 当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思!也就是具有相依性的服务可以写在这里呢! |
Alias | 进行一个链接的别名的意思!当 systemctl enable 相关的服务时,则此服务会进行链接文件的创建!以 multi-user.target 为例,这个家伙是用来作为默认操作环境 default.target 的规划, 因此当你设置用成 default.target 时,这个 /etc/systemd/system/default.target 就会链接到 /usr/lib/systemd/system/multi-user.target 啰! |
创建新的配置文件
/usr/lib/systemd/system目录下新建service-name.service文件, 根据上面的说明定义相应的[unit], [Service], [Install], 保存
重新加载配置文件
sudo systemctl daemon-reload
启动新的服务
sudo systemctl service-name.service
还没有评论,来说两句吧...