Ubuntu 16.04定时运行并终止bash程序的最优实现方案咨询
最佳实现方案:Cron + Bash 脚本组合
这个需求完全可以通过**Cron(系统定时任务)**配合自定义Bash脚本来实现,这也是Ubuntu系统下处理这类定时启停需求的标准玩法。下面我给你详细拆解步骤:
第一步:编写控制启停的Bash脚本
首先咱们写一个名为run_with_timeout.sh的脚本,它负责启动runme.sh,并在指定结束时间自动终止进程。脚本内容如下:
#!/bin/bash # 定义要运行的目标脚本(建议用绝对路径,避免路径问题) TARGET_SCRIPT="/path/to/runme.sh" # 临时文件存储目标进程的PID,防止重复启动 PID_FILE="/tmp/runme_pid.tmp" # 先检查是否已有运行中的进程 if [ -f "$PID_FILE" ]; then EXISTING_PID=$(cat "$PID_FILE") if ps -p "$EXISTING_PID" > /dev/null 2>&1; then echo "$(date +'%Y-%m-%d %H:%M:%S'): 脚本 $TARGET_SCRIPT 已在运行(PID: $EXISTING_PID),退出当前启动流程" exit 1 fi fi # 获取当前是周几(1=周一,7=周日) DAY_OF_WEEK=$(date +%u) # 根据周几确定结束时间的时间戳 if [ $DAY_OF_WEEK -ge 1 ] && [ $DAY_OF_WEEK -le 4 ]; then # 周一到周四:结束时间为当天18:00 END_TIME=$(date -d "today 18:00" +%s) elif [ $DAY_OF_WEEK -eq 5 ]; then # 周五:结束时间为周六18:00 END_TIME=$(date -d "tomorrow 18:00" +%s) else # 周六/周日:本脚本不该被cron触发,直接退出 echo "$(date +'%Y-%m-%d %H:%M:%S'): 当前时间不在计划运行区间内,退出" exit 1 fi # 计算需要运行的时长(秒) CURRENT_TIME=$(date +%s) RUN_DURATION=$((END_TIME - CURRENT_TIME)) # 处理启动时间晚于结束时间的异常情况 if [ $RUN_DURATION -le 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S'): 已过结束时间,无需启动脚本" exit 1 fi # 启动目标脚本并后台运行 bash "$TARGET_SCRIPT" & TARGET_PID=$! # 写入PID到临时文件 echo "$TARGET_PID" > "$PID_FILE" echo "$(date +'%Y-%m-%d %H:%M:%S'): 已启动 $TARGET_SCRIPT,PID: $TARGET_PID,将在 $RUN_DURATION 秒后自动终止" # 等待到结束时间 sleep $RUN_DURATION # 检查进程是否存活,存活则终止 if ps -p "$TARGET_PID" > /dev/null 2>&1; then echo "$(date +'%Y-%m-%d %H:%M:%S'): 到达结束时间,终止进程 $TARGET_PID" kill -9 "$TARGET_PID" else echo "$(date +'%Y-%m-%d %H:%M:%S'): 进程 $TARGET_PID 已提前退出" fi # 清理临时PID文件 rm -f "$PID_FILE"
脚本核心逻辑说明:
- 先做进程冲突检查,避免同一时间启动多个
runme.sh实例; - 根据当前周智能计算结束时间,不用硬编码多个规则;
- 记录进程PID,确保精准终止目标进程;
- 加入时间戳日志,方便后续排查问题。
第二步:给脚本添加执行权限
在终端里运行以下命令,让脚本具备可执行权限:
chmod +x /path/to/run_with_timeout.sh chmod +x /path/to/runme.sh
记得把
/path/to/替换成你实际存放脚本的目录路径。
第三步:配置Cron定时任务
Cron负责按时触发run_with_timeout.sh,操作步骤如下:
- 打开Cron任务编辑界面:
crontab -e
(首次打开会让你选择编辑器,推荐选nano,操作简单)
- 在文件末尾添加以下两行定时规则:
# 周一到周四 10:00 启动脚本,输出日志到指定文件 0 10 * * 1-4 /path/to/run_with_timeout.sh >> /var/log/runme_schedule.log 2>&1 # 周五 10:00 启动脚本,日志同上 0 10 * * 5 /path/to/run_with_timeout.sh >> /var/log/runme_schedule.log 2>&1
日志文件
/var/log/runme_schedule.log可以帮你追踪脚本的运行状态,方便排查异常。
- 保存并退出编辑器(nano编辑器按
Ctrl+O保存,Ctrl+X退出)。
额外注意事项
- 如果
runme.sh依赖特定环境变量(比如虚拟环境、自定义PATH),要在run_with_timeout.sh开头提前设置好; - 可以用
crontab -l命令查看当前Cron任务列表,确认配置是否生效; - 定期清理日志文件,避免占用过多磁盘空间;
- 若需要测试脚本,可手动运行
/path/to/run_with_timeout.sh,观察日志和进程状态。
内容的提问来源于stack exchange,提问作者angel_30
相关产品推荐
相关产品推荐

