首页 > 解决方案 > 带有python脚本“退出代码:127(找不到命令)”的Laravel任务计划

问题描述

我正在使用 laravel 5.8,并创建了一个控制台命令来调用 python 脚本(python 模块是PyVantagePro);

如果我在控制台中运行该命令可以正常工作,但是当我将 crontab 设置为自动运行脚本时,我收到错误“退出代码:127(找不到命令)”

完整的错误日志:

Symfony\Component\Process\Exception\ProcessFailedException: The command "pyvantagepro getarchives tcp:5.175.66.169:9002 --start "2019-05-19 07:00" --output /var/www/laravel/storage/stations_data/update_archive_6.csv" failed.

Exit Code: 127(Command not found)

Working directory: /var/www/laravel

Output:
================


Error Output:
================
sh: 1: pyvantagepro: not found
 in /var/www/laravel/app/Console/Commands/getReadings.php:78
Stack trace:
#0 [internal function]: App\Console\Commands\getReadings->handle()
#1 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#2 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#3 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#4 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php(576): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#5 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Console/Command.php(183): Illuminate\Container\Container->call(Array)
#6 /var/www/laravel/vendor/symfony/console/Command/Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#7 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Console/Command.php(170): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#8 /var/www/laravel/vendor/symfony/console/Application.php(908): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#9 /var/www/laravel/vendor/symfony/console/Application.php(269): Symfony\Component\Console\Application->doRunCommand(Object(App\Console\Commands\getReadings), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#10 /var/www/laravel/vendor/symfony/console/Application.php(145): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#11 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Console/Application.php(90): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#12 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(133): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#13 /var/www/laravel/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#14 {main}

标签: phppythonlaravelubuntu

解决方案


您的问题既不是 PHP 也不是 Python 相关的,但可能是“罪魁祸首”是$PATH环境变量,对于 cron 运行或 cron 用户(如果不同)是不同的。常见的解决方法是设置要执行的二进制文件的完整路径(而不是foo调用 ie /usr/bin/foo)或确保$PATHcron 使用的设置为预期值,指向要搜索调用的二进制文件的所有位置。这可以通过每个 crontab 全局完成,只需添加:

PATH=<value-for-PATH-variable>

到您的 crontab 文件的顶部。为了确保它与从命令行运行工具时的值相匹配,只需执行

echo $PATH

在 shell 中时,要么将那里的内容复制到 crontab,要么仅复制与pyvantagepro当前失败的工具相关的这些段(路径)(推荐方法)。


推荐阅读