未调用控制台命令中的 Handle() 函数
Handle() function in console command not being invoked
我在使用 Laravel 的控制台命令时遇到问题。我的问题是,当 运行 我使用 systemd(而不是 crontab)在控制台内核中安排的作业时,不会自动调用 handle() 函数。
让我试着进一步澄清发生了什么:
- 从控制台调用 'php artisan my:command' 时会自动调用 handle() 函数
- 当我通过在 ctontab 中调用 artisan 执行预定作业时,会自动调用 handle() 函数
- 当通过调用 artisan 作为 SYSTEMD 任务执行我的计划作业时,不会自动调用 handle() 函数。
这里的主要区别是 handle() 在使用 crontab 时被调用,但在使用 systemd 时不被调用。
任何了解 systemd 调度的人都知道这是为什么吗?我可以从系统日志中看到我的命令正在被 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();
}
}
我现在有了解决方案。
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'。
我在使用 Laravel 的控制台命令时遇到问题。我的问题是,当 运行 我使用 systemd(而不是 crontab)在控制台内核中安排的作业时,不会自动调用 handle() 函数。
让我试着进一步澄清发生了什么:
- 从控制台调用 'php artisan my:command' 时会自动调用 handle() 函数
- 当我通过在 ctontab 中调用 artisan 执行预定作业时,会自动调用 handle() 函数
- 当通过调用 artisan 作为 SYSTEMD 任务执行我的计划作业时,不会自动调用 handle() 函数。 这里的主要区别是 handle() 在使用 crontab 时被调用,但在使用 systemd 时不被调用。
任何了解 systemd 调度的人都知道这是为什么吗?我可以从系统日志中看到我的命令正在被 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();
}
}
我现在有了解决方案。
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'。