我在使用Laravel的控制台命令时遇到问题。我的问题是在使用systemd(而不是crontab)在Console内核中运行我的预定作业时,不会自动调用handle()函数。
让我试着进一步澄清正在发生的事情:
有系统调度知识的人是否知道为什么会这样?我可以从系统日志中看到我的命令是由systemd服务调用的,但是,从不调用handle()函数。
您可能会说,为什么不使用crontab?然而,这不是我可以采取的方法,并且没有看到它为什么不应该工作的原因。帮助将不胜感激!
这是我的systemd artisan.service:
[Unit]
Description=Artisan service
After=network.target
[Service]
Type=simple
Environment=TLNN=/opt/tlnn
ExecStart=/usr/bin/php /srv/www/tlnn/artisan schedule:run
[Install]
WantedBy=multi-user.target
Kernel.php:
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Classes\InfoCommunications;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
\App\Console\Commands\SendData::class,
\App\Console\Commands\RefreshData::class,
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule( Schedule $schedule )
{
$schedule->command( 'TLNN:SendData' )->cron( '*/1 * * * *' );
$schedule->call( 'TLNN:RefreshData' )->twiceDaily( 6, 18 );
}
}
示例控制台命令:
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Classes\TlnnInfoCommunications;
class SendData extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'TLNN:SendData';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Description here...';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$tlnnInfoCommunications = new TlnnInfoCommunications();
$tlnnInfoCommunications->Run();
}
}
答案 0 :(得分:1)
我现在有了解决方案。
systemd服务'Type'应设置为'forking'而不是'simple'。
因此,将artisan.service更改为以下内容可解决此问题:
[Unit]
Description=Artisan service
After=network.target
[Service]
Type=forking
Environment=TLNN=/opt/tlnn
ExecStart=/usr/bin/php /srv/www/tlnn/artisan schedule:run
[Install]
WantedBy=multi-user.target
更改服务后不要忘记'systemctl daemon-reload'。