文章目录
- Shell脚本实战项目
- 自动化部署脚本
- 系统监控脚本
- 文件备份脚本
- 定时任务管理脚本
- 文件传输自动化脚本
- 自动化日志清理脚本
- 用户管理脚本
Shell脚本实战项目
在掌握了 Shell 脚本的基本语法和高级技巧后,实践是进一步提升脚本编写能力的关键。通过参与一些实际的项目,我们可以更加熟练地运用 Shell 脚本来自动化任务,提升工作效率。
自动化部署脚本
自动化部署是运维和开发中常见的任务。通过编写自动化部署脚本,我们可以将繁琐的部署过程简化,确保部署的一致性和效率。
-
自动化部署脚本示例:
假设我们需要部署一个 Web 应用,并且该应用依赖于数据库和其他服务。我们可以通过一个 Shell 脚本来自动化部署过程。#!/bin/bash# 定义变量 APP_DIR="/var/www/myapp" BACKUP_DIR="/var/backups/myapp" DB_NAME="myapp_db" DB_USER="root" DB_PASS="password"# 步骤1: 更新系统 echo "Updating system..." apt-get update -y apt-get upgrade -y# 步骤2: 安装必要的软件包 echo "Installing required packages..." apt-get install -y apache2 mysql-server git# 步骤3: 克隆项目代码 echo "Cloning the project from GitHub..." git clone https://github.com/user/myapp.git $APP_DIR# 步骤4: 设置文件权限 echo "Setting permissions..." chown -R www-data:www-data $APP_DIR# 步骤5: 配置数据库 echo "Setting up the database..." mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE IF NOT EXISTS $DB_NAME;"# 步骤6: 启动服务 echo "Starting the application..." systemctl start apache2 systemctl start mysqlecho "Deployment completed!"
说明:
- 脚本首先更新系统和安装依赖的软件包。
- 然后,克隆 GitHub 上的项目代码到指定目录。
- 设置文件和目录的权限,确保 Web 服务器能正确访问。
- 最后,配置数据库并启动服务。
扩展功能:
- 可以通过
cron
或systemd
设置定时自动化部署。 - 使用
git pull
来更新项目代码,而不是每次都进行克隆。
系统监控脚本
系统监控脚本用于实时监控系统的健康状态,及时发现并处理问题。通过这些脚本,运维人员可以更高效地管理服务器,避免系统出现故障。
-
系统监控脚本示例:
下面是一个简单的系统监控脚本,用于检查系统资源使用情况,如 CPU、内存、磁盘等,并将结果输出到日志文件中。#!/bin/bash# 定义日志文件 LOGFILE="/var/log/system_monitor.log"# 获取当前日期和时间 DATE=$(date '+%Y-%m-%d %H:%M:%S')# 记录当前日期和时间 echo "Monitoring started at $DATE" >> $LOGFILE# 检查 CPU 使用率 CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}') echo "CPU Usage: $CPU_USAGE%" >> $LOGFILE# 检查内存使用情况 MEM_USAGE=$(free -m | grep Mem | awk '{print $3/$2 * 100.0}') echo "Memory Usage: $MEM_USAGE%" >> $LOGFILE# 检查磁盘空间 DISK_USAGE=$(df -h | grep '^/dev/' | awk '{ print $5 " " $6 }') echo "Disk Usage:" >> $LOGFILE echo "$DISK_USAGE" >> $LOGFILE# 检查当前登录的用户 USERS=$(who) echo "Logged-in Users:" >> $LOGFILE echo "$USERS" >> $LOGFILE# 完成监控 echo "Monitoring completed at $(date '+%Y-%m-%d %H:%M:%S')" >> $LOGFILE
说明:
- 脚本首先记录当前的时间戳。
- 然后,使用
top
命令获取 CPU 使用率,free
命令获取内存使用情况,df
命令检查磁盘空间。 - 所有监控信息都会输出到日志文件
/var/log/system_monitor.log
中,便于后续查看。
扩展功能:
- 可以通过
cron
定期执行此脚本,实时记录系统状态。 - 可以加入告警机制,当某项资源使用率超过阈值时发送邮件或短信通知。
文件备份脚本
在生产环境中,定期备份是确保数据安全和可靠性的关键。通过编写一个自动化备份脚本,可以定期备份重要文件或目录,并进行压缩和远程存储。
示例
#!/bin/bash# 定义备份目录和目标存储路径
SOURCE_DIR="/home/user/important_data"
BACKUP_DIR="/var/backups"
REMOTE_SERVER="user@backup-server:/backups"
DATE=$(date '+%Y-%m-%d-%H%M%S')# 步骤1: 创建备份文件夹(如果不存在)
mkdir -p $BACKUP_DIR# 步骤2: 压缩并备份文件
echo "Starting backup of $SOURCE_DIR to $BACKUP_DIR/backup-$DATE.tar.gz"
tar -czf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE_DIR# 步骤3: 将备份文件上传至远程服务器
echo "Uploading backup to remote server..."
scp $BACKUP_DIR/backup-$DATE.tar.gz $REMOTE_SERVER# 步骤4: 清理过期的备份文件(保留最近7个备份)
echo "Cleaning up old backups..."
cd $BACKUP_DIR
ls -t | grep "backup-" | awk 'NR>7' | xargs rm -fecho "Backup completed!"
说明:
- 脚本会创建备份文件并进行压缩。
- 然后,它会将备份文件上传到远程服务器。
- 最后,脚本清理掉过期的备份,只保留最近7个备份文件。
扩展功能:
- 可以使用
cron
来定期执行备份任务。 - 增加备份通知(通过邮件等方式)告知备份成功或失败。
定时任务管理脚本
在 Linux 系统中,cron
是最常用的定时任务管理工具。通过 Shell 脚本,用户可以简化定时任务的添加、删除和查看操作,避免手动编辑 crontab 文件。
示例
#!/bin/bash# 定义任务和时间参数
TASK_COMMAND="$1"
TASK_TIME="$2"
TASK_NAME="$3"# 检查输入参数
if [[ -z "$TASK_COMMAND" || -z "$TASK_TIME" || -z "$TASK_NAME" ]]; thenecho "Usage: $0 <command> <time> <task_name>"exit 1
fi# 添加定时任务
echo "$TASK_TIME $TASK_COMMAND # Task: $TASK_NAME" >> /etc/crontab# 重新加载 crontab 配置
systemctl restart cronecho "Scheduled task '$TASK_NAME' added successfully!"
说明:
- 脚本允许用户传入定时任务命令、执行时间和任务名称。
- 它会将任务添加到系统的 crontab 文件中,并重启
cron
服务,使之生效。
扩展功能:
- 可以加入功能来删除指定任务,或者列出当前所有的定时任务。
- 可以扩展为检查时间格式的有效性,避免输入错误的时间参数。
文件传输自动化脚本
在日常运维中,文件的自动化传输是非常常见的需求。通过 Shell 脚本,可以实现文件从本地到远程服务器,或者从一个服务器到另一个服务器的自动传输。
示例
#!/bin/bash# 定义源文件夹和目标路径
SOURCE_DIR="/home/user/files"
TARGET_SERVER="user@remote-server:/home/user/backup"
DATE=$(date '+%Y-%m-%d-%H%M%S')# 步骤1: 压缩文件
echo "Compressing files in $SOURCE_DIR..."
tar -czf /tmp/files_$DATE.tar.gz -C $SOURCE_DIR .# 步骤2: 传输文件到远程服务器
echo "Transferring files to remote server..."
scp /tmp/files_$DATE.tar.gz $TARGET_SERVER# 步骤3: 清理临时文件
rm -f /tmp/files_$DATE.tar.gzecho "File transfer completed!"
说明:
- 脚本将指定目录的文件进行压缩。
- 然后将压缩文件通过
scp
命令传输到远程服务器。 - 最后,清理掉临时文件。
扩展功能:
- 可以加上同步检查,避免重复传输。
- 在传输过程中,增加重试机制,确保文件传输成功。
自动化日志清理脚本
为了保证系统的稳定性,定期清理日志文件是非常重要的。过多的日志文件会占用磁盘空间,影响系统性能。通过 Shell 脚本,可以定期清理指定的日志文件。
示例
#!/bin/bash# 定义日志目录和保留的天数
LOG_DIR="/var/log"
RETENTION_DAYS=30# 步骤1: 查找并删除超过 $RETENTION_DAYS 天的日志文件
echo "Cleaning up logs older than $RETENTION_DAYS days..."
find $LOG_DIR -type f -name "*.log" -mtime +$RETENTION_DAYS -exec rm -f {} \;echo "Log cleanup completed!"
说明:
- 脚本会查找指定目录下所有
.log
文件,并删除超过指定天数的日志文件。 - 我们可以根据需要调整
RETENTION_DAYS
的值,控制日志保留的时间。
扩展功能:
- 可以增加日志备份功能,在删除日志之前先备份到指定目录。
- 可以通过邮件通知系统管理员清理的结果。
用户管理脚本
在多人使用的系统中,管理用户账户是运维人员的常见任务。通过 Shell 脚本,可以简化添加、删除、修改用户的过程。
示例
#!/bin/bash# 获取操作类型(添加、删除、修改)
ACTION=$1
USER_NAME=$2
USER_PASSWORD=$3# 判断是否传入必要的参数
if [[ -z "$ACTION" || -z "$USER_NAME" ]]; thenecho "Usage: $0 <add|del|modify> <username> [password]"exit 1
fi# 根据不同的操作执行
case $ACTION inadd)# 添加用户if id "$USER_NAME" &>/dev/null; thenecho "User $USER_NAME already exists!"elseuseradd "$USER_NAME"if [[ -n "$USER_PASSWORD" ]]; thenecho "$USER_NAME:$USER_PASSWORD" | chpasswdfiecho "User $USER_NAME added successfully!"fi;;del)# 删除用户userdel -r "$USER_NAME"echo "User $USER_NAME deleted successfully!";;modify)# 修改用户密码if [[ -n "$USER_PASSWORD" ]]; thenecho "$USER_NAME:$USER_PASSWORD" | chpasswdecho "Password for $USER_NAME modified successfully!"elseecho "Please provide a new password!"exit 1fi;;*)echo "Invalid action! Use add, del or modify."exit 1;;
esac
说明:
- 该脚本可以用于添加、删除和修改用户账户。
- 可以通过输入参数来指定操作类型(添加、删除、修改),以及要操作的用户名和密码。
扩展功能:
- 可以加入更多用户信息的设置,比如分配用户组等。
- 通过邮件通知操作结果,或记录操作日志。