Anlass 06.10.2026: Nach dem Deploy von v1.3.0 hat queue:restart den Worker beendet, Supervisor lief nicht, über eine Stunde blieben KI-Prüfungen und Mails liegen, ohne dass es auffiel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
51 lines
1.8 KiB
PHP
51 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Jobs\Monitoring\QueueProbe;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Sleep;
|
|
use Illuminate\Support\Str;
|
|
|
|
/**
|
|
* Prüft, ob ein Queue-Worker läuft: stellt einen Test-Job ein und wartet,
|
|
* bis er abgeholt ist (Aufruf am Ende von dev/betrieb/deploy.sh).
|
|
*
|
|
* Anlass 06.10.2026: Nach dem Deploy von v1.3.0 hat `queue:restart` den
|
|
* Worker beendet, Supervisor lief nicht und startete ihn nicht neu — über
|
|
* eine Stunde blieben KI-Prüfungen und Mails liegen, ohne dass es auffiel.
|
|
*/
|
|
class MonitoringQueueProbe extends Command
|
|
{
|
|
protected $signature = 'monitoring:queue-probe
|
|
{--wait=60 : Sekunden, die auf den Worker gewartet wird}';
|
|
|
|
protected $description = 'Prüft mit einem Test-Job, ob ein Queue-Worker läuft.';
|
|
|
|
public function handle(): int
|
|
{
|
|
$token = Str::random(16);
|
|
$wait = max(0, (int) $this->option('wait'));
|
|
|
|
QueueProbe::dispatch($token);
|
|
|
|
for ($second = 0; $second <= $wait; $second++) {
|
|
if (Cache::has(QueueProbe::cacheKey($token))) {
|
|
Cache::forget(QueueProbe::cacheKey($token));
|
|
$this->info(sprintf('Queue-Worker läuft (Test-Job nach %d s abgeholt).', $second));
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
if ($second < $wait) {
|
|
Sleep::for(1)->second();
|
|
}
|
|
}
|
|
|
|
$this->error(sprintf('Kein Queue-Worker hat den Test-Job innerhalb von %d s abgeholt.', $wait));
|
|
$this->line('Worker in Ploi prüfen (Site ▸ Queue). Läuft Supervisor? Notfalls: nohup php artisan queue:work database --queue=classification,default --tries=3 --max-time=3600 &');
|
|
|
|
return self::FAILURE;
|
|
}
|
|
}
|