Linux基础教程 第八课:定时任务和系统服务管理

浏览量:21 次 发布时间:2026-01-18 14:41 作者:明扬工控商城 下载docx

最近更新:Linux基础教程 第15课:Linux内核和驱动管理


好的,我们继续第八课。今天学习两个重要的系统管理主题:定时任务和系统服务管理。


第一部分:定时任务(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系统管理的核心内容。慢慢练习,从简单的任务开始,逐渐增加复杂度。


有问题吗?完成练习后,我们可以继续第九课:磁盘管理和文件系统。


明扬工控商城

推荐阅读:

Linux基础教程 第20课:Linux安全攻防和渗透测试基础

Linux基础教程 第19课:性能调优和容量规划

Linux基础教程 第18课:Linux云计算基础

Linux基础教程 第17课:自动化运维工具

Linux基础教程 第16课:集群和高可用性

Linux基础教程 第15课:Linux内核和驱动管理

热门标签:
Linux基础教程 第八课:定时任务和系统服务管理.docx

将本文的Word文档下载到电脑

推荐度:

下载

全部评论

请登录
产业新闻-明扬资讯网
科技资讯-明扬资讯网