Linux Service 服务详解:分类、服务生命周期、运行级别、管理命令等

📅 发布时间:2026/7/8 15:15:15 👁️ 浏览次数:
Linux Service 服务详解:分类、服务生命周期、运行级别、管理命令等
Linux Service 服务详解一、什么是 Linux 服务服务Service是指在后台运行、为系统或其他应用程序提供特定功能的进程。在 Linux 中服务也被称为守护进程Daemon通常以d结尾如sshd、httpd、mysqld。二、服务的类型1. 按启动方式分类类型说明示例独立启动常驻内存独立运行sshd、httpd瞬态服务按需启动用完即止systemd-logind定时启动按计划执行cron、atd依赖启动由其他服务触发socket-activated 服务2. 按功能分类系统服务sshd, network, firewalld 应用服务nginx, mysql, redis 定时服务crond, atd 日志服务rsyslog, journald 安全服务selinux, auditd三、服务的生命周期1. 服务的状态流转startstopreloaddisableenable停止运行禁用2. 查看服务状态# systemd 系统systemctl status sshd# 输出解读● sshd.service - OpenSSH server daemon Loaded: loaded(/usr/lib/systemd/system/sshd.service;enabled;vendor preset: enabled)Active: active(running)since Mon2023-01-0112:00:00 CST;2days ago Docs: man:sshd(8)man:sshd_config(5)Process:1234ExecStart/usr/sbin/sshd -D$OPTIONS(codeexited,status0/SUCCESS)Main PID:1235(sshd)Tasks:1(limit:23456)Memory:2.5M CGroup: /system.slice/sshd.service └─1235 /usr/sbin/sshd -D状态字段解释Loaded: 服务是否已加载是否开机自启Active: 当前运行状态Main PID: 主进程 IDTasks: 服务创建的进程数Memory: 内存占用CGroup: control group 信息四、服务的运行级别传统 SysVinit 运行级别级别目标描述0halt关机1single user mode单用户模式维护2multi-user mode多用户模式无网络3multi-user mode完整多用户模式文本界面4unused未使用5X11图形界面模式6reboot重启systemd 目标Target对应# 查看当前运行级别systemctl get-default# 切换运行级别systemctl isolate multi-user.target# 切换到文本模式systemctl isolate graphical.target# 切换到图形模式# 设置默认运行级别systemctl set-default multi-user.target五、服务管理命令对比1. systemd 系统现代发行版# 基本操作systemctl start service_name# 启动systemctl stop service_name# 停止systemctl restart service_name# 重启systemctl reload service_name# 重载配置systemctl status service_name# 查看状态# 开机自启管理systemctlenableservice_name# 启用开机自启systemctl disable service_name# 禁用开机自启systemctl is-enabled service_name# 检查是否开机自启# 高级操作systemctl mask service_name# 屏蔽服务无法启动systemctl unmask service_name# 取消屏蔽systemctl list-dependencies# 查看依赖关系2. SysVinit 系统旧版# 服务管理serviceservice_name startserviceservice_name stopserviceservice_name restartserviceservice_name status# 开机自启管理chkconfig--add service_namechkconfigservice_name onchkconfigservice_name offchkconfig--list service_name3. 其他 init 系统Upstart (Ubuntu 旧版)start service_name stop service_name restart service_name status service_name六、服务的配置文件1. systemd 服务单元文件完整示例Redis 服务[Unit] DescriptionRedis persistent key-value database Afternetwork.target Afternetwork-online.target Wantsnetwork-online.target [Service] # 运行用户 Userredis Groupredis # 工作目录 WorkingDirectory/var/lib/redis # 环境变量 EnvironmentFile-/etc/redis/redis.conf EnvironmentREDIS_PORT6379 # 启动命令 ExecStart/usr/bin/redis-server /etc/redis/redis.conf ExecStop/usr/bin/redis-cli shutdown ExecReload/bin/kill -USR2 $MAINPID # 重启策略 Restartalways RestartSec5 # 资源限制 LimitNOFILE65536 LimitNPROC16 # 安全设置 PrivateTmptrue NoNewPrivilegestrue ProtectSystemfull ProtectHometrue ReadWritePaths/var/lib/redis /var/log/redis [Install] WantedBymulti-user.target Aliasredis.service2. 传统 init 脚本示例/etc/init.d/nginx#!/bin/sh### BEGIN INIT INFO# Provides: nginx# Required-Start: $local_fs $remote_fs $network $syslog# Required-Stop: $local_fs $remote_fs $network $syslog# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: nginx init script### END INIT INFOPATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binNAMEnginxDAEMON/usr/sbin/nginxcase$1instart)echoStarting$NAME$DAEMON;;stop)echoStopping$NAME$DAEMON-s stop;;restart)$0stopsleep1$0start;;status)ifpgrep -xnginx/dev/null;thenecho$NAMEis runningelseecho$NAMEis stoppedfi;;*)echoUsage:$0{start|stop|restart|status}exit1;;esac七、实战案例案例1部署 Node.js 应用服务1. 创建应用目录mkdir-p /opt/myappcd/opt/myappnpminit -ynpminstallexpress2. 创建应用文件/opt/myapp/app.jsconstexpressrequire(express);constappexpress();app.get(/,(req,res){res.send(Hello from Node.js service!);});app.listen(3000,(){console.log(App listening on port 3000);});3. 创建服务单元文件/etc/systemd/system/myapp.service[Unit] DescriptionMy Node.js Application Afternetwork.target Wantsnetwork.target [Service] Typesimple Usernodeuser Groupnodeuser WorkingDirectory/opt/myapp EnvironmentNODE_ENVproduction EnvironmentPORT3000 ExecStart/usr/bin/node /opt/myapp/app.js Restartalways RestartSec10 # 安全配置 PrivateTmptrue NoNewPrivilegestrue ProtectSystemfull ProtectHometrue ReadWritePaths/opt/myapp/logs # 资源限制 LimitNOFILE1000000 MemoryMax512M CPUQuota50% [Install] WantedBymulti-user.target4. 管理服务# 创建运行用户useradd-r -s /bin/false nodeuser# 设置权限chown-R nodeuser:nodeuser /opt/myapp# 启动服务systemctl daemon-reload systemctl start myapp systemctlenablemyapp systemctl status myapp案例2数据库服务配置调优MySQL 服务配置优化# 查看 MySQL 服务状态systemctl status mysqld# 查看服务使用的配置文件systemctlcatmysqld# 修改服务启动参数mkdir/etc/systemd/system/mysqld.service.dvim/etc/systemd/system/mysqld.service.d/override.conf[Service] # 增加打开文件数限制 LimitNOFILE65535 # 添加启动参数 EnvironmentMYSQLD_OPTS--innodb_buffer_pool_size4G --max_connections500 # CPU 和内存限制 CPUQuota80% MemoryMax8G MemoryHigh6G# 应用修改systemctl daemon-reload systemctl restart mysqld案例3日志服务管理配置 rsyslog 收集应用日志# 创建 rsyslog 配置vim/etc/rsyslog.d/myapp.conf# 将 myapp 日志输出到单独文件 if $programname myapp then /var/log/myapp.log stop# 在服务中配置日志输出vim/etc/systemd/system/myapp.service[Service] StandardOutputsyslog StandardErrorsyslog SyslogIdentifiermyapp八、服务监控与调试1. 实时监控# 监控特定服务watch-n1systemctl status myapp | grep Active# 查看实时日志journalctl -u myapp -f# 查看服务资源占用systemd-cgtop2. 性能分析# 分析服务启动耗时systemd-analyze blame|grepmyapp# 查看服务依赖图systemd-analyze dot myapp|dot -Tsvgmyapp-deps.svg# 检查服务配置systemd-analyze verify /etc/systemd/system/myapp.service3. 故障排查流程# 1. 检查基本状态systemctl status myapp# 2. 查看详细日志journalctl -u myapp -n100--no-pager -l# 3. 检查端口监听ss -tlnp|grepmyapp# 4. 检查进程psaux|grepmyapp# 5. 检查系统资源free-mdf-htop-p$(pgrep -f myapp)# 6. 检查服务文件systemctlcatmyappls-l /etc/systemd/system/myapp.service4. 常见问题及解决问题可能原因解决方法服务启动失败配置文件错误systemd-analyze verify服务启动超时启动时间过长增加 TimeoutStartSec服务频繁重启程序崩溃检查日志调整 Restart 策略服务无法停止进程卡住systemctl kill service_name端口被占用端口冲突修改配置文件端口权限不足文件权限问题检查用户和组权限九、服务安全最佳实践1. 最小权限原则[Service] # 使用非 root 用户运行 Usernobody Groupnogroup # 限制文件系统访问 ProtectSystemstrict ReadWritePaths/var/lib/myapp PrivateTmptrue ProtectHometrue # 禁止获取新权限 NoNewPrivilegestrue # 限制网络访问 PrivateNetworktrue2. 资源限制[Service] # CPU 限制 CPUQuota50% # 内存限制 MemoryMax512M MemoryHigh400M # 进程数限制 TasksMax100 # 文件描述符限制 LimitNOFILE10243. 安全沙箱[Service] # 系统调用过滤 SystemCallFilter~privileged obsolete # 禁止内存执行 MemoryDenyWriteExecutetrue # 只读文件系统 ProtectKernelTunablestrue ProtectKernelModulestrue ProtectControlGroupstrue十、服务的自动化运维1. 批量管理# 批量启停服务forserviceinnginx php-fpm mysql;dosystemctl restart$servicedone# 检查多个服务状态services(nginxmysqlredis)forsin${services[]};doifsystemctl is-active --quiet$s;thenecho$sis runningelseecho$sis NOT runningfidone2. 服务健康检查脚本#!/bin/bash# service-healthcheck.shSERVICE_NAME$1CHECK_URL$2EXPECTED_CODE$3# 检查服务进程if!systemctl is-active --quiet$SERVICE_NAME;thenecho$(date): Service$SERVICE_NAMEis down, restarting...systemctl restart$SERVICE_NAMEsleep5fi# HTTP 健康检查if[-n$CHECK_URL];thenHTTP_CODE$(curl-s -o /dev/null -w%{http_code}$CHECK_URL)if[$HTTP_CODE!$EXPECTED_CODE];thenecho$(date): Health check failed (got$HTTP_CODE), restarting...systemctl restart$SERVICE_NAMEfifi3. 定时任务配合# 每天凌晨重启服务释放内存03* * * /usr/bin/systemctl restart myapp# 每小时检查服务状态*/60 * * * * /usr/local/bin/check-service.sh myapp总结Linux 服务管理是现代系统管理的核心技能。通过深入理解服务的生命周期、配置方法和管理技巧您可以提高系统可靠性通过适当的重启策略和监控优化资源利用通过资源限制和配置调优增强安全性通过最小权限原则和沙箱机制简化运维通过自动化脚本和批量管理无论是简单的 Web 服务还是复杂的分布式系统良好的服务管理实践都是确保系统稳定运行的基础。