You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,操作步骤如下:

  1. 打开Cron任务编辑界面:
crontab -e

(首次打开会让你选择编辑器,推荐选nano,操作简单)

  1. 在文件末尾添加以下两行定时规则:
# 周一到周四 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可以帮你追踪脚本的运行状态,方便排查异常。

  1. 保存并退出编辑器(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:09:21