第一次接触Linux服务管理是在2008年,当时还在使用CentOS 5系统。记得当时要配置一个MySQL服务开机自启,老同事教我用的就是chkconfig命令。十几年过去了,Linux的服务管理方式已经发生了翻天覆地的变化。这种变化不是简单的命令替换,而是整个设计理念的革新。
传统System V init系统采用串行启动方式,服务按顺序一个一个启动。这种设计在服务器性能较弱的年代还能接受,但随着多核CPU成为标配,串行启动就显得效率低下了。我清楚地记得在一台老服务器上,系统启动要花费近5分钟时间,其中大部分时间都在等待各种服务顺序启动。
systemd的出现彻底改变了这一局面。它采用并行启动机制,可以同时启动多个服务。在实际测试中,同一台服务器的启动时间从5分钟缩短到了30秒左右。不仅如此,systemd还引入了服务依赖管理、日志集中收集、资源控制等现代特性,让Linux服务管理进入了新时代。
chkconfig本质上是一个管理/etc/rc[0-6].d目录链接的工具。每个运行级别(0-6)对应一个目录,里面存放着以S或K开头的符号链接,分别表示启动(Start)和停止(Kill)服务。比如:
bash复制ls -l /etc/rc3.d/
你会看到类似这样的输出:
code复制lrwxrwxrwx 1 root root 20 Mar 15 2022 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 Mar 15 2022 K50netconsole -> ../init.d/netconsole
数字表示启动顺序,系统会按数字从小到大依次执行。这种设计简单直接,但也存在明显局限。比如无法处理复杂的服务依赖关系,如果network服务启动需要依赖其他服务,只能靠人工确保数字顺序正确。
添加一个新服务到chkconfig管理:
bash复制chkconfig --add nginx
查看服务在各运行级别的状态:
bash复制chkconfig --list nginx
设置服务在运行级别3和5自动启动:
bash复制chkconfig --level 35 nginx on
在实际运维中,我遇到过不少坑。比如修改了服务脚本但忘记重新加载chkconfig配置,导致变更不生效。正确的做法是:
bash复制chkconfig --del nginx
chkconfig --add nginx
很多人不知道,service其实只是一个shell脚本。可以用以下命令查看其内容:
bash复制cat /usr/sbin/service
这个脚本的主要作用是:
启动Apache服务:
bash复制service httpd start
停止MySQL服务:
bash复制service mysqld stop
重启网络服务:
bash复制service network restart
查看服务状态:
bash复制service sshd status
在CentOS 7等过渡系统中,你可能会遇到这样的提示:
code复制Redirecting to /bin/systemctl status sshd.service
这说明系统虽然保留了service命令,但实际已经转向systemd管理。这种兼容性设计让过渡期更加平滑。
systemd不仅仅是init系统的替代品,它提供了一套完整的服务管理解决方案:
启动一个服务:
bash复制systemctl start nginx
设置开机自启:
bash复制systemctl enable nginx
查看服务状态:
bash复制systemctl status nginx
这个命令会显示丰富的信息,包括:
查看服务依赖关系:
bash复制systemctl list-dependencies nginx
限制服务资源使用:
bash复制systemctl set-property nginx MemoryLimit=500M
这个功能在共享主机环境中特别有用,可以防止某个服务耗尽所有资源。
快速判断方法:
bash复制ps -p 1 -o comm=
或者:
bash复制stat /proc/1/exe
在管理多台服务器时,我习惯先运行这个命令确认环境,避免用错命令。
在CentOS 7/RHEL 7等过渡系统上,可以这样兼容处理:
bash复制if systemctl status &> /dev/null; then
# systemd系统
systemctl restart nginx
else
# System V系统
service nginx restart
fi
将System V脚本转换为systemd unit文件:
bash复制systemd-sysv-convert /etc/init.d/old-service
这个命令会生成一个基本的.service文件,通常还需要手动调整一些参数。
使用journalctl查看日志:
bash复制journalctl -u nginx --since "1 hour ago"
检查服务依赖:
bash复制systemctl list-dependencies nginx
验证unit文件语法:
bash复制systemd-analyze verify /etc/systemd/system/nginx.service
查看启动耗时:
bash复制systemd-analyze
分析各服务启动时间:
bash复制systemd-analyze blame
这个命令能帮你找出拖慢启动的服务,在优化启动速度时特别有用。
编辑systemd配置:
bash复制vim /etc/systemd/system.conf
调整这些参数:
code复制DefaultTimeoutStartSec=30s
DefaultTimeoutStopSec=15s
为关键服务保留CPU资源:
bash复制systemctl set-property nginx CPUQuota=80%
限制内存使用:
bash复制systemctl set-property nginx MemoryMax=1G
这些设置会持久化到/etc/systemd/system.control/目录下,重启后仍然有效。
为服务创建专用用户:
bash复制useradd -r -s /sbin/nologin nginx
然后在service文件中配置:
code复制[Service]
User=nginx
Group=nginx
启用基本沙盒功能:
code复制[Service]
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
这些选项可以限制服务只能访问必要的文件和目录。