关闭ThinkPHP6定时任务需按运行模式区分:Crontab任务删/注释规则并kill残留进程;Workerman/Swoole类执行stop命令或kill -15/-9;EasyTask类运行stop命令并清理pid文件;最后用lsof、ps和日志验证是否彻底关闭。

关闭 ThinkPHP6 定时任务后台进程,关键看它用的是哪种运行模式:是 Crontab 调度的短生命周期脚本,还是常驻内存的守护进程(如基于 Workerman、Swoole 或 EasyTask 的长任务)。两者关闭方式完全不同,不能混用。
一、Crontab 调度的命令行任务(最常见)
这类任务本身不“常驻”,每次执行完就退出。所谓“关闭”,其实是停止 Crontab 规则生效,防止它再次触发:
- 执行 crontab -e,找到对应任务那一行(例如
*/5 * * * * /usr/bin/php /var/www/myproject/think cron:run >> /var/log/cron.log 2>&1),删掉或在行首加#注释 - 保存退出后,规则立即失效,无需重启任何服务
- 如果该任务正在运行中(比如一个耗时较长的清理脚本),可手动查杀:
ps aux | grep 'think cron:run' | grep -v grep | awk '{print $2}' | xargs kill -9
二、Workerman/Swoole 类常驻进程(需主动终止)
若你用的是 php think timer start、php console.php start 或自定义 Workerman 服务,进程会持续运行。必须发送停止信号:
- 优先使用框架封装的 stop 命令(推荐):
php think timer stop或php console.php stop - 若支持 force 参数,可强制终止所有子进程:
php console.php stop force - 命令无效时,查进程 PID:
ps aux | grep 'your_script_name' | grep -v grep,再执行kill -15 [PID](优雅退出);仍不退出再用kill -9 [PID] - 注意:Workerman 进程默认会忽略 SIGTERM,需在代码中注册
pcntl_signal(SIGTERM, ...)才能响应 stop 命令
三、EasyTask 或自研 Task 类守护进程
这类通常自带 start/status/stop 接口,关闭逻辑由类内部控制:
立即学习“PHP免费学习笔记(深入)”;
- 运行
php think task stop或php console.php stop,它会尝试向主进程发信号并等待子任务自然结束 - 若卡住,检查是否遗漏了
$task->stop($force = true)中的 force 参数——true 表示跳过等待,直接 kill 子进程 - 确保 runtime 目录下没有残留的 pid 文件(如
runtime/task.pid),有则手动删除,否则下次 start 可能误判为已在运行
四、验证是否真正关闭
别只信命令返回,要确认系统层面无残留:
- 查端口占用(如监听了 8080):
lsof -i :8080或netstat -tuln | grep :8080 - 查 PHP 进程:
ps aux | grep php | grep -v grep,重点看有没有含think、timer、worker字样的进程 - 查看日志末尾是否有 “exited”、“shutdown”、“cleanup done” 类关键词,确认退出流程走完



















