适用环境:项目已安装于 /data/wwwroot/sharpgit/ 的 CentOS Linux 服务器(CentOS 7 及以上,含 systemd)。
目标:一键完成 Go 执行引擎的安装、配置、开机自启与健康自检,使计划任务由 Go 引擎以受控并发方式执行。
需准备两个文件(在 Windows 开发机上确认存在):
| 文件 | 作用 | 位置 |
|---|---|---|
| go_scheduler_linux_amd64 | Go 调度引擎 Linux 二进制(amd64 架构) | 项目 go_service/go_scheduler/ 目录 |
| deploy_sharp_scheduler.sh | 一键部署脚本(自动探测路径、自动生成配置) | 项目根目录 |
提示:建议先在后台“计划任务-调度配置”确认并发数、分级超时、重型任务名单并保存(保存会自动重新生成部署脚本),再上传服务器,保证脚本与配置同源。
第 1 步:在项目根目录下确认文件是否有在服务当中:
/项目根目录/go_service/go_scheduler/go_scheduler_linux_amd64 /项目根目录/deploy_sharp_scheduler.sh登录后台并访问http://你的项目管理后台/admin.php/core/crontab-config 启用Go执行引擎并配置参数,让系统重新生成deploy_scheduler.sh文件。
第 2 步:登录服务器,使用 root 执行:
cd /项目的根目录 sed -i 's/\r$//' deploy_sharp_scheduler.sh # 防 CRLF 行尾(可选) bash deploy_sharp_scheduler.sh
第 3 步:脚本自动完成 7 个步骤:
看到 “==== 部署成功 ====” 即部署完成。脚本任一步失败会立刻报错退出,可直接定位问题。
systemctl status go_scheduler # 应为 active (running)
systemctl is-enabled go_scheduler # 应为 enabled(开机自启)
curl -s http://127.0.0.1:18080/health # 期望输出 {"status":"ok"}
tail -f /var/log/go_scheduler.log # 引擎运行日志
浏览器打开后台“计划任务-调度配置”,Go 引擎当前状态应显示“运行中(HTTP 200)”;下次调度入口触发时,日志会出现 “[GO] submitted N task(s)”,表示任务已真正交给 Go 引擎执行。
1. 安装二进制:
install -m 0755 /项目根目录/go_service/go_scheduler/go_scheduler_linux_amd64 /usr/local/bin/go_scheduler
2. 生成配置文件:
mkdir -p /etc/sharp
cat > /etc/sharp/go_scheduler.json <<'EOF'
{
"listen": "127.0.0.1:18080",
"php_bin": "/usr/bin/php",
"crontab_dir": "/项目根目录/inc/crontab",
"runner_script": "/项目根目录/inc/crontab/runner.php",
"backfill_script": "/项目根目录/inc/crontab/backfill.php",
"concurrency": "auto",
"heavy_max": 0,
"heavy_tasks": ["cms_index_to_html.php", "cms_spider.php", "db_backup.php"],
"default_timeout": 300,
"task_timeout": {"cms_spider.php": 3600, "default": 300},
"log_file": "/var/log/go_scheduler.log"
}
EOF
3. 配置 systemd 服务并启动:
cat > /etc/systemd/system/go_scheduler.service <<'EOF' [Unit] Description=sharp Go Scheduler After=network.target [Service] Type=simple ExecStart=/usr/local/bin/go_scheduler -config /etc/sharp/go_scheduler.json Restart=always RestartSec=3 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload && systemctl enable --now go_scheduler
4. 健康检查:
curl -s http://127.0.0.1:18080/health
5. 写入 crontab 调度入口(手动部署时需自行添加,否则任务不会定时触发):
*/5 * * * * /usr/bin/php /项目根目录/inc/crontab/auto_crontab.php # sharp-scheduler
| 现象 | 原因 | 处理方法 |
|---|---|---|
| [错误] 缺少 Go 引擎二进制 | 二进制未上传到项目 go_service/go_scheduler/ 目录 | 重新 scp 上传后再次执行脚本 |
| 健康检查未通过 / curl 连不上 | 端口被占用、二进制架构不符、SELinux 拦截 | netstat -lnp | grep 18080 查端口;file /usr/local/bin/go_scheduler 查架构;临时 setenforce 0 测试 SELinux |
| 服务器为 arm64 架构 | 脚本默认识别 amd64 二进制 | 使用 GOARCH=arm64 交叉编译,并将二进制命名为 go_scheduler 放入同一目录 |
| [错误] 未找到 php 二进制 | php 不在 PATH 且不在常见安装路径 | export PATH=/自定义/php/bin:$PATH 后重跑,或手动指定 |
| 脚本报 $'\r' 相关错误 | 脚本为 CRLF 行尾 | 执行 sed -i 's/\r$//' deploy_sharp_scheduler.sh |
| 系统无 systemctl 命令 | CentOS 6 及更早版本不支持 systemd | 改用 /etc/init.d/ 方式托管服务(或升级系统) |
| 参数 | 说明 | 默认值 |
|---|---|---|
| concurrency | 全局并发上限;auto 表示按 CPU 核数自动套用(2核=2 / 4核=3 / 8核+=4) | auto |
| heavy_tasks | 重型任务名单(静态化/采集/备份/分表等),同脚本绝不并发 | 内置 17 项评估名单 |
| task_timeout | 按脚本分级的超时时间(秒),未命中的使用 default | default 300 |
| min_start_interval | 任务间最小启动间隔(秒),避免到期任务齐发 | 2 |
| log_enabled | 是否记录调度日志 | true |