Laravel使用Spatie备份工具执行定时任务时出现「No input file specified」错误的技术求助
我帮你一步步排查这个问题,这个错误大概率是PHP找不到artisan文件的正确路径或者使用了错误的PHP模式导致的,结合你的部署方式(public文件夹移到public_html,其余文件在根目录),我们可以按以下步骤解决:
1. 修正Cron命令的工作目录
首先确认你的artisan文件所在位置——根据你的描述,项目核心文件(包括artisan)应该在用户根目录(比如/home/user/),而不是/home/user/foldername/(除非foldername是你的项目根目录)。
把Cron命令改成这样(替换成你实际的项目根目录):
cd /home/user/ && php artisan schedule:run >> /home/user/cron.out 2>&1
加上2>&1是为了把错误信息也输出到日志文件,方便后续排查问题。
2. 确保使用PHP CLI版本
很多主机环境里,默认的php命令可能是CGI模式的,而Laravel的artisan需要CLI模式的PHP才能正常运行。你可以先在SSH里执行以下命令找到CLI版本的路径:
which php-cli
假设输出是/usr/bin/php-cli,那把Cron命令里的php换成这个路径:
cd /home/user/ && /usr/bin/php-cli artisan schedule:run >> /home/user/cron.out 2>&1
3. 修复Kernel里的调度规则(避免冗余执行)
你当前的调度规则有矛盾:daily()->everyMinute()会让任务每分钟执行一次,这显然不是你想要的“每日备份”。改成明确的每日执行时间,比如凌晨2点清理备份,2点10分执行备份:
// app/Console/Kernel.php protected function schedule(Schedule $schedule) { // 每日凌晨2点清理过期备份 $schedule->command('backup:clean')->dailyAt('02:00'); // 每日凌晨2点10分执行完整备份 $schedule->command('backup:run')->dailyAt('02:10'); }
4. 手动验证artisan命令
先SSH到服务器,切换到项目根目录,手动执行备份命令,确认是否能正常运行:
cd /home/user/ php artisan backup:run
如果手动执行也报错,再检查Spatie备份的配置(比如config/backup.php里的存储路径是否正确、权限是否足够),但当前的错误先聚焦在路径和PHP版本上。
5. 检查目录权限
确保Cron执行的用户(通常是你的系统用户或者www-data)对项目根目录有读写权限,尤其是storage/、bootstrap/cache/以及备份存储的目标目录,避免因权限不足导致的隐性错误。
内容的提问来源于stack exchange,提问作者user3653474

