跳转至

生信服务器基础配置:启动服务

关于开机启动服务,CentOS 6 的命令是 chkconfig,CentOS 7 是 systemctl。

CentOS 6 中的 chkconfig 命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记 chkconfig 不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

CentOS 7 中如果要让任务开机自启动,需将对应的 Unit 文件存放于 /etc/systemd/system 下。即 systemctl 将服务加入开机自启动的操作,实际上是在 /etc/systemd/system 某个 target.wants 目录下创建服务配置文件的软链接文件。而显然的,禁用服务开机自启动的操作是移除软链接。

$ systemctl enable rsyncd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.

$ systemctl disable rsyncd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service.

Linux OS 将操作环境分为以下 7 个等级,即: 0:关机 1:单用户模式(单用户、无网络) 2:无网络支持的多用户模式(多用户、无网络) 3:有网络支持的多用户模式(多用户、有网络) 4:保留,未使用 5:有网络支持有 X-Window 支持的多用户模式(多用户、有网络、X-Window 界面) 6:重新引导系统,即重启

查看自启动服务

# CentOS 6
chkconfig --list        # 显示开机启动服务列表

# CentOS 7
systemctl list-unit-files --type service | grep enabled

查看某服务的开机启动状态

# CentOS 6
chkconfig --list servicename
# 例如
# chkconfig --list httpd
# 输出:httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# 说明:默认情况下,on 和 off 开关只对运行级 2,3,4,5 有效。
# 说明:上面的输出 0-6 都为 off,表示没有自动启动。

# CentOS 7
systemctl list-unit-files --type service | grep service_name

启动(关闭,重启,查看)某个服务

# CentOS 6
service  service_name   (start|stop|restart|status)

# CentOS 7
systemctl (start|stop|restart|status) service_name

设置开机启动或者关闭某个服务

# CentOS 6
# 1. 服务脚本必须存放在 /etc/ini.d/ 目录下
cp xxx /etc/ini.d/
# 2. 增加/删除所指定的系统服务,让 chkconfig 指令得以管理它
chkconfig --add/--del service_name
# 3. 开启/关闭服务,不指定任何运行级别的 chkconfig on 将启用运行级别 2、3、4 和 5上 的服务。
chkconfig  service_name  on/off

# CentOS 7
systemctl enable  service_name      # 开机启动
systemctl disable  service_name     # 开机关闭

以下内容节选自《systemd 时代的开机自启动任务 | 骏马金龙》,供参考。

systemd 中自定义开机自启动命令/脚本

  • 在 SysV 系统中,要让某个命令或者某个脚本开机自启动,可以将命令或者脚本的命令行写入 /etc/rc.d/rc.local 文件中。

  • 在 systemd 中,要让命令或者某个脚本开机自启动,要么将其编写成一个开机自启动服务,要么通过兼容的 /etc/rc.d/rc.local。

但更建议的方案是编写开机自启动服务,后面会专门介绍服务管理配置文件如何编写。

下面是一个简单的让命令(脚本)开机自启动的配置文件:

$ cat /usr/lib/systemd/system/mycmd.service
[Unit]
Description = some shell script
# 要求脚本具有可执行权限
ConditionFileIsExecutable=/usr/bin/some.sh

# 指定要运行的命令、脚本
[Service]
ExecStart = /usr/bin/some.sh

# 下面这段不能少
[Install]
WantedBy = multi-user.target

$ systemctl daemon-reload
$ systemctl enable mycmd.service

如果要使用 /etc/rc.local 的方式呢?systemd 提供了 rc-local.service 服务来加载 /etc/rc.d/rc.local 文件中的命令。

$ cat /usr/lib/systemd/system/rc-local.service
# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.d/rc.local is executable.
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes

这个文件缺少了 [Install] 段且没有 WantedBy,后面将会解释 Install 中的 WantedBy 表示设置该服务开机自启动时,该服务加入到哪个『运行级别』中启动。

但这个文件的注释中说明了,如果 /etc/rc.d/rc.local 文件存在且具有可执行权限,则 systemd-rc-local-generator 将会自动添加到 multi-user.target 中,所以,即使没有 Install 和 WantedBy 也无关紧要。

另一方面需要注意,和 SysV 系统在系统启动的最后阶段运行 rc.local 不太一样,systemd 兼容的 rc.local 是在 network.target 即网络相关服务启动完成之后就启动的,这意味着 rc.local 可能在开机启动过程中较早的阶段就开始运行。

如果想要将命令加入到 /etc/rc.local 中实现开机自启动,直接写入该文件,并设置该文件可执行权限即可。

例如:

echo -e '#!/bin/bash\ndate +"%F %T" >/tmp/a.log' >>/etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local