2026-01-23
最近更新:Linux基础教程 第18课:Linux云计算基础
2026-01-23
2026-01-23
2026-01-23
最近更新:Linux基础教程 第15课:Linux内核和驱动管理
2026-01-21
浏览量:21 次 发布时间:2026-01-18 14:41 作者:明扬工控商城 下载docx
2026-01-23
最近更新:Linux基础教程 第18课:Linux云计算基础
2026-01-23
2026-01-23
2026-01-23
最近更新:Linux基础教程 第15课:Linux内核和驱动管理
2026-01-21
好的,我们继续第八课。今天学习两个重要的系统管理主题:定时任务和系统服务管理。
第一部分:定时任务(Cron)
1.1 什么是Cron?
Cron是Linux系统中用来定期执行任务的工具。比如:
每天凌晨备份数据库
每周清理日志文件
每小时检查系统状态
1.2 Cron的基本概念
bash
# 查看cron服务状态
systemctl status cron
# 查看所有用户的cron任务
sudo cat /etc/passwd | cut -d: -f1 | xargs -I {} sudo crontab -l -u {}
Cron任务格式:
text
* * * * * 要执行的命令
│ │ │ │ │
│ │ │ │ └── 星期几 (0-7,0和7都代表星期日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)
1.3 Cron时间表达式示例
text
* * * * * 每分钟执行
*/5 * * * * 每5分钟执行
0 * * * * 每小时执行(整点)
30 2 * * * 每天凌晨2:30执行
0 9-18 * * * 每天9点到18点整点执行
0 9 * * 1-5 工作日(周一到周五)上午9点执行
@daily 每天午夜执行(相当于0 0 * * *)
@weekly 每周日午夜执行
@monthly 每月1号午夜执行
@reboot 系统启动时执行
1.4 管理Cron任务
bash
# 编辑当前用户的cron任务(会打开编辑器)
crontab -e
# 查看当前用户的cron任务
crontab -l
# 删除当前用户的所有cron任务
crontab -r
# 删除cron任务但保留文件(交互式)
crontab -ri
# 编辑其他用户的cron任务(需要root权限)
sudo crontab -u username -e
# 导入cron任务文件
crontab cronfile.txt
1.5 实际例子:创建备份任务
bash
# 创建备份脚本
vim ~/backup_script.sh
输入内容:
bash
#!/bin/bash
# 备份脚本
BACKUP_DIR="/home/$(whoami)/backups"
SOURCE_DIR="/home/$(whoami)/important_files"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 执行备份
tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR" 2>/dev/null
# 删除7天前的备份
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +7 -delete
echo "备份完成: backup_$DATE.tar.gz" >> /tmp/backup.log
bash
# 给脚本执行权限
chmod +x ~/backup_script.sh
# 添加cron任务,每天凌晨2点执行
crontab -e
在打开的编辑器中添加:
text
0 2 * * * /home/你的用户名/backup_script.sh
1.6 系统级Cron任务
除了用户cron,还有系统cron:
bash
# 查看系统cron目录
ls -la /etc/cron.*
# 系统cron文件格式(需要指定用户)
# /etc/crontab 格式:
# * * * * * 用户名 命令
# 添加系统cron任务(需要sudo)
sudo vim /etc/crontab
系统级cron目录:
text
/etc/cron.d/ # 自定义cron文件
/etc/cron.daily/ # 每天执行的脚本
/etc/cron.hourly/ # 每小时执行的脚本
/etc/cron.weekly/ # 每周执行的脚本
/etc/cron.monthly/ # 每月执行的脚本
1.7 练习:创建定时任务
创建一个脚本,每小时记录系统负载
bash
vim ~/log_load.sh
bash
#!/bin/bash
echo "$(date): 系统负载: $(uptime)" >> ~/load.log
bash
chmod +x ~/log_load.sh
crontab -e
# 添加:0 * * * * /home/你的用户名/log_load.sh
验证cron任务
bash
# 查看cron日志
sudo grep CRON /var/log/syslog | tail -10
# 或者专门看cron日志(Ubuntu)
sudo cat /var/log/cron.log
第二部分:Systemd服务管理
2.1 什么是Systemd?
Systemd是现代Linux系统的初始化系统和服务管理器,替代了旧的SysV init。
2.2 基本服务管理命令
bash
# 启动服务
sudo systemctl start servicename
# 停止服务
sudo systemctl stop servicename
# 重启服务
sudo systemctl restart servicename
# 重新加载配置(不重启服务)
sudo systemctl reload servicename
# 查看服务状态
sudo systemctl status servicename
# 启用服务开机自启
sudo systemctl enable servicename
# 禁用服务开机自启
sudo systemctl disable servicename
# 查看服务是否启用
sudo systemctl is-enabled servicename
# 查看服务配置文件
sudo systemctl cat servicename
# 编辑服务配置文件
sudo systemctl edit servicename
2.3 常用服务示例
bash
# SSH服务
sudo systemctl status ssh
sudo systemctl restart ssh
# Nginx/Apache服务
sudo systemctl status nginx
sudo systemctl status apache2
# 数据库服务
sudo systemctl status mysql
sudo systemctl status postgresql
# 防火墙
sudo systemctl status ufw
# Docker服务
sudo systemctl status docker
2.4 查看所有服务
bash
# 列出所有运行中的服务
sudo systemctl list-units --type=service
# 列出所有服务(包括未运行的)
sudo systemctl list-units --type=service --all
# 列出所有失败的服务
sudo systemctl list-units --type=service --state=failed
# 列出所有已启用的服务
sudo systemctl list-unit-files --type=service | grep enabled
2.5 查看服务日志(Journalctl)
bash
# 查看服务的所有日志
sudo journalctl -u servicename
# 查看今天的日志
sudo journalctl -u servicename --since today
# 查看最近100行日志
sudo journalctl -u servicename -n 100
# 实时查看日志(类似tail -f)
sudo journalctl -u servicename -f
# 查看特定时间段的日志
sudo journalctl -u servicename --since "2024-01-01 00:00:00" --until "2024-01-02 00:00:00"
# 查看优先级为error的日志
sudo journalctl -u servicename -p err
# 查看所有服务的日志
sudo journalctl
2.6 创建自定义Systemd服务
示例1:创建一个简单的Web服务
bash
# 1. 创建Python脚本
vim ~/simple_web.py
输入内容:
python
#!/usr/bin/env python3
from http.server import HTTPServer, SimpleHTTPRequestHandler
import os
os.chdir('/tmp') # 设置服务的工作目录
server = HTTPServer(('0.0.0.0', 8080), SimpleHTTPRequestHandler)
print('服务器启动在 http://0.0.0.0:8080')
server.serve_forever()
bash
# 给执行权限
chmod +x ~/simple_web.py
示例2:创建Systemd服务文件
bash
sudo vim /etc/systemd/system/simple-web.service
输入内容:
ini
[Unit]
Description=简单的Web服务器
After=network.target
[Service]
Type=simple
User=你的用户名
WorkingDirectory=/tmp
ExecStart=/usr/bin/python3 /home/你的用户名/simple_web.py
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
示例3:管理这个服务
bash
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start simple-web
# 查看状态
sudo systemctl status simple-web
# 查看日志
sudo journalctl -u simple-web -f
# 测试服务
curl http://localhost:8080
# 停止服务
sudo systemctl stop simple-web
# 开机自启
sudo systemctl enable simple-web
2.7 Systemd定时器(替代cron)
Systemd也可以管理定时任务,比cron更灵活。
bash
# 1. 创建服务文件
sudo vim /etc/systemd/system/backup.service
ini
[Unit]
Description=备份重要文件
[Service]
Type=oneshot
ExecStart=/bin/bash /home/你的用户名/backup_script.sh
User=你的用户名
bash
# 2. 创建定时器文件
sudo vim /etc/systemd/system/backup.timer
ini
[Unit]
Description=每天凌晨2点执行备份
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
bash
# 3. 启用定时器
sudo systemctl daemon-reload
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
# 4. 查看定时器
sudo systemctl list-timers
sudo systemctl status backup.timer
2.8 练习:创建自定义服务
创建一个监控脚本,检查磁盘使用情况
bash
vim ~/monitor_disk.sh
bash
#!/bin/bash
THRESHOLD=80
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt $THRESHOLD ]; then
echo "$(date): 磁盘使用率超过阈值: ${DISK_USAGE}%" >> /tmp/disk_alert.log
# 可以添加发送邮件的功能
fi
bash
chmod +x ~/monitor_disk.sh
创建Systemd服务和定时器
bash
# 创建服务文件
sudo vim /etc/systemd/system/disk-monitor.service
ini
[Unit]
Description=磁盘使用率监控
[Service]
Type=oneshot
ExecStart=/bin/bash /home/你的用户名/monitor_disk.sh
User=你的用户名
bash
# 创建定时器
sudo vim /etc/systemd/system/disk-monitor.timer
ini
[Unit]
Description=每小时检查磁盘使用率
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
bash
# 启用定时器
sudo systemctl daemon-reload
sudo systemctl enable disk-monitor.timer
sudo systemctl start disk-monitor.timer
sudo systemctl status disk-monitor.timer
第三部分:系统启动流程
3.1 查看系统启动时间
bash
# 查看系统启动时间
uptime
who -b
systemd-analyze
# 分析启动过程
systemd-analyze time
systemd-analyze blame # 查看每个服务的启动时间
systemd-analyze critical-chain # 查看关键链
3.2 运行级别(Runlevel)
Systemd使用target替代传统的运行级别:
bash
# 查看当前target
systemctl get-default
# 查看所有target
systemctl list-units --type=target
# 切换到多用户模式
sudo systemctl isolate multi-user.target
# 切换到图形界面
sudo systemctl isolate graphical.target
# 设置默认target
sudo systemctl set-default multi-user.target
3.3 常用target
poweroff.target:关机
rescue.target:救援模式
multi-user.target:多用户文本模式
graphical.target:图形界面
reboot.target:重启
第四部分:进程管理补充
4.1 进程和服务的区别
进程:正在运行的程序实例
服务:由Systemd管理的后台进程,通常提供某种功能
4.2 进程守护
使用Systemd可以确保服务在崩溃后自动重启:
ini
# 在service文件的[Service]部分添加
Restart=always # 总是重启
RestartSec=10 # 等待10秒后重启
StartLimitInterval=100
StartLimitBurst=5 # 5分钟内最多重启5次
4.3 资源限制
ini
# 限制服务资源使用
[Service]
MemoryLimit=100M # 内存限制
CPUQuota=50% # CPU使用限制
第五部分:实战练习
练习1:综合定时任务
创建一个完整的备份系统:
每天凌晨3点备份指定目录
每周日清理30天前的备份
备份完成后发送通知(写入日志)
使用Systemd定时器实现
练习2:服务监控脚本
编写一个脚本,监控以下服务,如果停止则自动重启:
SSH服务
Nginx服务
数据库服务
练习3:创建自己的服务
创建一个简单的HTTP API服务,使用Systemd管理:
python
# api_server.py
from flask import Flask
app = Flask(__name__)
@app.route('/status')
def status():
return {'status': 'ok', 'service': 'my-api'}
@app.route('/version')
def version():
return {'version': '1.0.0'}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
第六部分:故障排除
6.1 Cron任务不执行
bash
# 1. 检查cron服务状态
systemctl status cron
# 2. 查看cron日志
sudo grep CRON /var/log/syslog
# 3. 检查脚本权限
ls -la /path/to/script.sh
# 4. 在cron中使用绝对路径
# 错误: python script.py
# 正确: /usr/bin/python3 /full/path/script.py
# 5. 捕获错误输出
* * * * * /path/to/script.sh >> /tmp/cron.log 2>&1
6.2 Systemd服务启动失败
bash
# 1. 查看详细状态
sudo systemctl status servicename -l
# 2. 查看完整日志
sudo journalctl -u servicename -xe
# 3. 检查配置文件语法
sudo systemd-analyze verify /etc/systemd/system/servicename.service
# 4. 手动测试命令
sudo -u username /path/to/command
# 5. 检查依赖关系
systemctl list-dependencies servicename
6.3 服务权限问题
bash
# 1. 检查服务用户
sudo systemctl show servicename -p User,Group
# 2. 检查SELinux/AppArmor
sudo aa-status
sudo sestatus
# 3. 查看文件权限
namei -l /path/to/resource
今日总结
今天我们学习了:
定时任务(Cron):
使用crontab命令管理个人定时任务
理解Cron时间表达式
系统级Cron任务的位置
Systemd服务管理:
使用systemctl管理服务
使用journalctl查看服务日志
创建自定义Systemd服务
使用Systemd定时器
关键概念:
服务与进程的区别
服务的自动重启和资源限制
系统启动流程和运行级别
重要提示:
定时任务中要使用绝对路径
Systemd服务配置修改后要daemon-reload
学会查看日志是排查问题的关键
测试服务时先手动运行命令确保正常
这些知识是Linux系统管理的核心内容。慢慢练习,从简单的任务开始,逐渐增加复杂度。
有问题吗?完成练习后,我们可以继续第九课:磁盘管理和文件系统。
将本文的Word文档下载到电脑
推荐度: