4 min read

Linux服务状态查看完全指南:从systemctl到传统init命令

Linux服务状态查看完全指南:从systemctl到传统init命令

在Linux系统管理中,查看服务状态是日常运维的重要技能。不同的Linux发行版使用不同的初始化系统,因此需要掌握多种查看方法。本文将详细介绍在各种环境下查看service状态的完整方案。

1. systemd系统(现代主流发行版)

现代Linux发行版如Ubuntu 16.04+、CentOS 7+、Debian 8+等都采用systemd作为初始化系统,systemctl是管理服务的标准命令。

查看单个服务状态

# 基本语法
systemctl status <service-name>

# 实际示例
systemctl status nginx
systemctl status apache2
systemctl status mysql
systemctl status docker

查看所有服务状态

# 查看所有已加载的服务状态
systemctl list-units --type=service

# 查看所有服务文件状态(包括未激活的)
systemctl list-unit-files --type=service

# 只查看运行中的服务
systemctl list-units --type=service --state=running

# 只查看失败的服务
systemctl list-units --type=service --state=failed

状态输出解读

$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2023-10-10 14:30:00 CST; 1 day ago
     Docs: man:nginx(8)
  Process: 1234 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 1235 (nginx)
    Tasks: 2 (limit: 4915)
   Memory: 10.5M
   CGroup: /system.slice/nginx.service
           ├─1235 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─1236 nginx: worker process

关键字段说明:

  • Loaded: 服务是否加载,是否启用开机自启
  • Active: 服务当前状态(active/running, inactive/dead, failed等)
  • Main PID: 服务主进程ID
  • Memory: 内存使用情况

2. SysV init系统(较老系统)

对于Ubuntu 14.04及以前、CentOS 6及以前等使用传统SysV init的系统,需要使用不同的命令。

查看服务状态

# 查看单个服务状态
service <service-name> status

# 查看所有服务状态
service --status-all

# 使用init.d脚本
/etc/init.d/<service-name> status

示例

service httpd status
/etc/init.d/mysqld status
service --status-all | grep mysql

3. 使用进程查看命令辅助验证

除了专用的服务管理命令,还可以通过进程和端口信息来验证服务状态。

查看服务相关进程

# 查看特定服务的进程
ps aux | grep nginx
ps -ef | grep mysql

# 查看进程树
pstree -p | grep nginx

# 查看端口占用(网络服务)
netstat -tulpn | grep :80
ss -tulpn | grep :80

查看服务日志

# 使用journalctl查看systemd服务日志
journalctl -u nginx.service
journalctl -u nginx.service --since "2023-10-10 14:00:00"
journalctl -u nginx.service -f  # 实时跟踪

# 查看传统日志文件
tail -f /var/log/nginx/error.log
tail -f /var/log/mysql/error.log

4. Upstart系统

部分系统使用Upstart作为初始化系统(如Ubuntu 14.10及以前),需要使用initctl命令。

# 查看单个服务状态
initctl status <service-name>

# 查看所有服务状态
initctl list

5. 如何确定系统类型

不确定你的系统使用哪种初始化系统?可以通过以下方法检查:

# 检查systemd
systemctl --version

# 检查Upstart
initctl --version

# 检查进程1(init进程)
ps -p 1 -o comm=

6. 实用的状态检查脚本

快速检查多个服务

#!/bin/bash
# 检查多个关键服务的状态

services=("nginx" "mysql" "redis" "docker")

for service in "${services[@]}"; do
    echo "=== $service status ==="
    if systemctl is-active $service >/dev/null 2>&1; then
        echo "✓ $service is running"
    else
        echo "✗ $service is not running"
    fi
done

详细的服务状态报告

#!/bin/bash
# 生成详细的服务状态报告

echo "=== 系统服务状态报告 ==="
echo "生成时间: $(date)"
echo ""

# 运行中的服务
echo "运行中的服务:"
systemctl list-units --type=service --state=running --no-pager

echo ""
echo "失败的服务:"
systemctl list-units --type=service --state=failed --no-pager

echo ""
echo "关键服务状态:"
critical_services=("nginx" "mysql" "ssh" "firewalld")
for service in "${critical_services[@]}"; do
    status=$(systemctl is-active $service 2>/dev/null || echo "not-found")
    enabled=$(systemctl is-enabled $service 2>/dev/null || echo "unknown")
    printf "%-15s %-10s %-10s\n" "$service" "$status" "$enabled"
done

7. 状态判断快捷命令

# 检查服务是否活跃
systemctl is-active nginx

# 检查服务是否启用开机自启
systemctl is-enabled nginx

# 检查服务是否失败
systemctl is-failed nginx

# 一次性查看活跃和启用状态
systemctl show nginx -p ActiveState -p SubState -p LoadState

总结

推荐使用systemctl命令(现代系统):

# 基本状态查看
systemctl status servicename

# 快速状态判断
systemctl is-active servicename
systemctl is-enabled servicename

# 详细日志查看
journalctl -u servicename

掌握这些命令和服务状态查看技巧,将大大提高你的Linux系统管理效率。根据你的系统类型和具体需求,选择最合适的方法来监控和管理服务状态。