#php #laravel #laravel-artisan #systemd
#php #laravel #laravel-artisan #systemd
Вопрос:
У меня возникли проблемы с консольными командами Laravel. Моя проблема в том, что функция handle() не вызывается автоматически при выполнении моих запланированных заданий в консольном ядре с использованием systemd (а не crontab).
Позвольте мне попытаться уточнить, что происходит:
- Функция handle() вызывается автоматически при вызове «php artisan my:command» с консоли
- Функция handle() вызывается автоматически, когда мои запланированные задания выполняются путем вызова artisan в ctontab
- Функция handle() НЕ вызывается автоматически, когда мои запланированные задания выполняются путем вызова artisan в качестве SYSTEMD-задачи. Ключевое отличие здесь в том, что handle() вызывается при использовании crontab, но не при использовании 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 AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
use AppClassesInfoCommunications;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
AppConsoleCommandsSendData::class,
AppConsoleCommandsRefreshData::class,
];
/**
* Define the application's command schedule.
*
* @param IlluminateConsoleSchedulingSchedule $schedule
* @return void
*/
protected function schedule( Schedule $schedule )
{
$schedule->command( 'TLNN:SendData' )->cron( '*/1 * * * *' );
$schedule->call( 'TLNN:RefreshData' )->twiceDaily( 6, 18 );
}
}
Пример консольной команды:
namespace AppConsoleCommands;
use IlluminateConsoleCommand;
use AppClassesTlnnInfoCommunications;
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();
}
}
Комментарии:
1. Вы рассматривали возможность планирования вашей команды в
Kernel.php
?2. @ArminSam Да, у меня запланированы задачи в Kernel.php . Именно они являются проблемой при запуске из systemd
Ответ №1:
Теперь у меня есть решение.
«Тип» службы systemd должен быть установлен на «разветвление», а не на «простой».
Следовательно, изменение 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’ после изменения serivce.