专栏首页小慢哥Linux运维最详细的CentOS 6与7对比(二):服务管理对比
原创

最详细的CentOS 6与7对比(二):服务管理对比

本主题将从3个角度进行对比

  1. 常见设置(CentOS 6 vs CentOS 7)
  2. 服务管理(Sysvinit vs Upstart vs Systemd)
  3. 性能测试(cpu/mem/io/oltp)

本文为第二部分:服务管理的对比


1. sysvinit、upstart、systemd简介

/

CentOS 5

CentOS 6

CentOS 7

备注

sysvinit

第一代,传统,兼容最多(/etc/init.d/、/etc/rc.X)

upstart

第二代,形似systemd雏形(/etc/init)

systemd

第三代,配合cgroup,systemd完全接管整个系统(/usr/lib/systemd)

2. sysvinit、upstart、systemd常用命令

动作

sysvinit

upstart

systemd

查看

service mytest status

initctl status mytest

systemctl status mytest.service

启动

service mytest start

initctl start mytest

systemctl start mytest.service

关闭

service mytest stop

initctl stop mytest

systemctl stop mytest.service

强杀进程

kill -9 PID

kill -9 PID

systemctl kill mytest.service --signal=9

重启

service mytest restart

initctl restart mytest

systemctl restart mytest.service

重载

service mytest reload

initctl reload mytest

systemctl reload mytest.service

开机启动

chkconfig mytest on

/etc/init/mytest.conf里配置start on runlevel 3

systemctl enable mytest.service

3. runlevel运行级别

运行级别

CentOS 6

CentOS 7

0

halt

runlevel0.target -> poweroff.target

1

Single user mode

runlevel1.target -> rescue.target

2

Multiuser, without NFS

runlevel2.target -> multi-user.target

3

Full multiuser mode

runlevel3.target -> multi-user.target

4

unused

runlevel4.target -> multi-user.target

5

X11

runlevel5.target -> graphical.target

6

reboot

runlevel6.target -> reboot.target

查看

cat /etc/inittab

systemctl get-default

开机生效

编辑/etc/inittab

systemctl set-default multi-user.target

立即切换

init 5

systemctl isolate graphical.target

4. 日志查询

CentOS 6: 手工在/var/log/messages、/var/log/dmesg、/var/log/secure中grep,麻烦且效率低

CentOS 7: 统一使用journalctl,可以使用多个因素匹配,比如时间段、服务名、日志级别等等。另外,systemd日志默认经过压缩,是二进制文件,无法直接查看

journalctl常用命令

作用

CentOS 6比

journalctl

所有日志,包含系统、内核等等

手动在对应日志文件中grep

journalctl --dmesg

查看当前开机后的内核日志

dmesg

journalctl --boot

查看当前开机后的日志

先查当前开机启动时间,然后cat /var/log/...

journalctl --boot=-1

查看上一次启动的日志

查询上次开机到当前开机之间时间,然后cat /var/log/...

journalctl --since="2018-08-01 12:00:00"

查看从指定时间开始到当前的日志

手动在日志里grep

journalctl --since=yesterday --until=today

查看昨天0-24点的日志

手动在日志里grep

journalctl -n 20

查看最后10行

tail -n 20

journalctl -f

实时滚动显示最新日志

tail -f

journalctl -e

直接翻到最后

tail

journalctl -u mytest.service

查看指定服务日志

先查询日志保存路径,然后再cat查看

journalctl -p 0

查看指定日志级别的日志,日志级别从0到7

通过syslog将不同级别的日志放到不同文件中

journalctl -u mytest.service -o json-pretty或-o verbose

查看每条日志详细信息(包含元信息)

journalctl --disk-usage

查看日志所在的磁盘空间

du -shx /var/log/messages等

5. 实现守护进程

CentOS 6

  • sysvinit需要自行实现
    • nohup &
    • screen
    • supervisor
  • upstart和systemd类似,将程序运行在前台即可

CentOS 7

  • 由systemd启动,将程序运行在前台即可

6. sysvinit、upstart、systemd例子

sysvinit

cat > /etc/init.d/mytest <<EOF
. /etc/rc.d/init.d/functions

start() { … }
stop() { … }
restart() { … }
reload() { … }
status() { … }

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
…
esac
exit $RETVAL
EOF

chmod +x /etc/init.d/mytest
service mytest start

upstart

cat > /etc/init/mytest.conf <<EOF
start on runlevel [3]
description “mytest"
exec /root/mytest.sh
EOF

initctl start mytest

systemd

cat > /usr/lib/systemd/system/mytest.service <<EOF
[Unit]
Description=mytest

[Service]
Type=simple
ExecStart=/root/mytest.sh

[Install]
WantedBy=multi-user.target
EOF

systemctl start mytest

7. PID管理

  • sysvinit: 需要生成PID文件,用于后期关闭、重启等使用
  • upstart: 无需PID文件,upstart会记录主进程ID,子进程ID没有记录
  • systemd: 无需PID文件,所有进程ID由cgroup统一接管

8. 内置的资源限制

CentOS 6: 除了ulimit,没有其他限制进程资源的简便方法

CentOS 7: 除了ulimit,还支持部分cgroup限制,可对进程做内存限制和cpu资源限制等

[Service]
ExecStart=...
MemoryLimit=500M
CPUShares=100

另外,CentOS 7可以通过systemd-cgtop命令查看cgroup里的性能数据

9. 服务异常自动重启

upstart

start on runlevel [3]

description "mytest"

exec /root/mytest.sh
post-stop exec sleep 5
respawn
respawn limit unlimited

systemd

[Unit]
Description=mytest

[Service]
Type=simple
ExecStart=/root/mytest.sh
Restart=always
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

上面2种方式均表示,无限次自动重启,每次重启前等待5秒

10. 写日志方式

CentOS 6: 自行输出到文件中,或通过syslog记录(如logger命令)

CentOS 7: 只要程序由systemd启动,只需将输出日志到标准输出或标准错误

  • 建议centos7只将应用程序的一些元信息输出到标准输出或标准错误,比如启动成功、启动失败等等
  • 不建议将业务日志输出到journal。因为journal中所有日志都存在一个文件中,会导致2个问题:
    • 如果没有做日志持久化,则默认存在内存中,会导致最多一半的内存被占用
    • 存储量很大,会导致查询其他日志很耗时
  • 解决办法:输出到syslog,Service支持StandardOutput=syslog

11. 指定每条日志级别

CentOS 6: 通过syslog将不同级别的日志输出到不同文件

CentOS 7: 只需在输出的每一行开头加<日志级别>,比如

echo '<0>hello, emerg'
echo '<1>hello, alert'
echo '<2>hello, crit'
echo '<3>hello, err'
echo '<4>hello, warning'
echo '<5>hello, notice'
echo '<6>hello, info'
echo '<7>hello, debug'

12. systemd日志永久保存

systemd日志默认保存在内存中,因此当服务器重启后,就无法通过journalctl来查看之前的日志,解决方法:

mkdir -p /var/log/journal
systemctl restart systemd-journald

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最详细的CentOS 6与7对比(三):性能测试对比

    如图所示,本次一共做了7项,其中有2项是CentOS 6与7基本一致,另外5项都是CentOS 7明显胜出,因此可以得出结论:CentOS 7的性能比CentO...

    小慢哥Linux运维
  • 最详细的CentOS 6与7对比(一):常见设置对比

    CentOS 6: grub界面键入e,在kernel行最后加1,键入b启动进入单用户模式,之后输入passwd修改密码

    小慢哥Linux运维
  • 基于KVM的SRIOV直通配置及性能测试

    ▷ 传统方式的瓶颈:qemu的网卡,传统方式是使用tap网卡,桥接到宿主的bridge上,但性能很差,尤其是包转发率很低,难以满足对性能要求比较高的场景。性能差...

    小慢哥Linux运维
  • Docker Hub 镜像加速器

    国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务。

    py3study
  • 影像数据揭秘下,一座城市到底能有几幅面孔?

    如果一座城市的楼房、街道、汽车、人、树木、都可以被标记,并被转化为可量化的评分体系,那么人与空间的感知关系则会拥有更多可能。上周的数据侠实验室,DT君邀请到城室...

    DT数据侠
  • Java实战操作MongoDB集群(副本集)

    Spring提供了MongoDB操作的工具:MongoTemplate,使得在Spring环境下对MongoDB的操作更为便利,本章我们就来学一下如何用Mong...

    程序员欣宸
  • 严选 | Elasticsearch史上最全最常用工具清单

    工欲善其事必先利其器,ELK Stack的学习和实战更是如此,特将工作中用到的“高效”工具分享给大家。

    用户1390885
  • cannot be cast to javax.servlet.Servlet

    报错:cannot be cast to javax.servlet.Servlet 原因以及解决办法:public class WageTaxServlet ...

    闵开慧
  • 《大话计算机》内容节选(第1期)

    根据【第1期】《大话计算机》内容你点我贴一贴中所述,冬瓜哥收集了 “大话存储” 和 ”大话计算机” 中帖子下的留言如下(蓝色表示往期已回答,红色表示本期...

    冬瓜哥
  • Python支付接口汇总大全

    微信支付接口 ? wzhifuSDK [1]- 由微信支付SDK 官方PHP Demo移植而来,v3.37 weixin_pay [2]- 是一个简单的微信支付...

    Python中文社区

扫码关注云+社区

领取腾讯云代金券