web-dev-qa-db-ja.com

保持方法Laravel=サーバーで実行中のキューシステム

最近、Laravelキューシステムをセットアップしました。基本は、cronjobがジョブをキューに追加するコマンドを呼び出し、電子メールを送信する2番目のコマンドを呼び出すことです。

サーバーにsshしてphp artisan queue:listenを実行するとシステムは動作しますが、端末を閉じるとリスナーがシャットダウンし、sshに戻ってジョブをスタックし、sshに戻ってリッスンするまで待ちます。

SSH経由で接続を開いたままにすることなく、キューシステムをバックグラウンドで実行し続ける最良の方法は何ですか?

php artisan queue:work --daemon、およびキュー内のジョブを完了しましたが、端末を閉じたときに接続とバックグラウンドプロセスを閉じました。

45
zeros-and-ones

コマンド

Nohup php artisan queue:work --daemon &

正しい場合、SSH接続を閉じた後もプロセスを続行できます。ただし、これは短期的な修正にすぎません。サーバーが再起動されるか、何らかの問題が原因でプロセスが停止すると、戻ってコマンドを再度実行する必要があります。それが起こるとき、あなたは決して知りません。金曜日の夜に発生する可能性があるため、長期的なソリューションを実装することをお勧めします。

私は結局Supervisordに切り替えました。これはUbuntuに簡単にインストールできます

Sudo apt-get install supervisor 

AWS-AMIまたはRedHatユーザーの場合、この質問で説明した一連の指示に従うことができます。

AWS AMI Linuxサーバーでのスーパーバイザーのセットアップ

11
zeros-and-ones

ランニング

Nohup php artisan queue:work --daemon &

ログアウト時にコマンドが終了するのを防ぎます。

末尾のアンパサンド(&)により、プロセスはバックグラウンドで開始されるため、シェルを引き続き使用でき、スクリプトが完了するまで待つ必要はありません。

Nohup を参照してください

Nohup-tty以外への出力で、ハングアップに影響されないコマンドを実行します

これにより、コマンドを実行するディレクトリのNohup.outという名前のファイルに情報が出力されます。出力に興味がない場合は、stdoutとstderrを/ dev/nullにリダイレクトするか、同様に通常のlaravelログに出力できます。たとえば、

Nohup php artisan queue:work --daemon > /dev/null 2>&1 &

Nohup php artisan queue:work --daemon > app/storage/logs/laravel.log &

ただし、 Supervisord のようなものを使用して、サービスが実行されたままで、クラッシュ/障害後に再起動されるようにする必要もあります。

53
Ben Swinburne

Linux supervisor を使用する必要があります

インストールは簡単で、Ubuntuでは次のコマンドでインストールできます。

apt-get install supervisor

スーパーバイザー構成ファイルは/etc/supervisor/conf.dディレクトリーにあります。

[program:email-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel-example/artisan queue:work redis --queue=emailqueue --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/laravel-example//storage/logs/supervisord.log

プロセスごとに、新しいプロセス構成ファイルを作成する必要があります。この構成では、リスナーは各ジョブを3回再試行します。また、Supervisorは、リスナーが失敗した場合、またはシステムが再起動した場合にリスナーを再起動します。

17
Manish Nakar

から https://Gist.github.com/ivanvermeyen/b72061c5d70c61e86875

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class EnsureQueueListenerIsRunning extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'queue:checkup';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Ensure that the queue listener is running.';

    /**
     * Create a new command instance.
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        if ( ! $this->isQueueListenerRunning()) {
            $this->comment('Queue listener is being started.');
            $pid = $this->startQueueListener();
            $this->saveQueueListenerPID($pid);
        }

        $this->comment('Queue listener is running.');
    }

    /**
     * Check if the queue listener is running.
     *
     * @return bool
     */
    private function isQueueListenerRunning()
    {
        if ( ! $pid = $this->getLastQueueListenerPID()) {
            return false;
        }

        $process = exec("ps -p $pid -opid=,cmd=");
        //$processIsQueueListener = str_contains($process, 'queue:listen'); // 5.1
        $processIsQueueListener = ! empty($process); // 5.6 - see comments

        return $processIsQueueListener;
    }

    /**
     * Get any existing queue listener PID.
     *
     * @return bool|string
     */
    private function getLastQueueListenerPID()
    {
        if ( ! file_exists(__DIR__ . '/queue.pid')) {
            return false;
        }

        return file_get_contents(__DIR__ . '/queue.pid');
    }

    /**
     * Save the queue listener PID to a file.
     *
     * @param $pid
     *
     * @return void
     */
    private function saveQueueListenerPID($pid)
    {
        file_put_contents(__DIR__ . '/queue.pid', $pid);
    }

    /**
     * Start the queue listener.
     *
     * @return int
     */
    private function startQueueListener()
    {
        //$command = 'php-cli ' . base_path() . '/artisan queue:listen --timeout=60 --sleep=5 --tries=3 > /dev/null & echo $!'; // 5.1
        $command = 'php-cli ' . base_path() . '/artisan queue:work --timeout=60 --sleep=5 --tries=3 > /dev/null & echo $!'; // 5.6 - see comments
        $pid = exec($command);

        return $pid;
    }
}
4
Harry Bosh

最良の方法は、キューを監視してそのログを確認できるPM2(Node.js用の高度な生産プロセスマネージャー)です。

プロジェクトディレクトリで以下のコマンドを使用して、キューワーカーを実行します。

pm2 start artisan --name laravel-worker --interpreter php -- queue:work --daemon
4
faridcs

1)Sudo apt install supervisor または

Sudo apt-get install supervisor

2)cd /etc/supervisor/conf.d 3)内部に新しいファイルを作成する

Sudo vim queue-worker.conf

ファイル内容

[program:email-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/laravelproject/artisan queue:work
autostart=true
autorestart=true
user=root
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/html/laravelproject/storage/logs/supervisord.log

4)Sudo supervisorctl reread

このコマンドを実行すると、出力queue-worker:availableが取得されます

5)Sudo supervisorctl update

このコマンドを実行すると、出力キューワーカー:プロセスグループが追加されます。

他のコマンド

1)Sudo supervisorctl reload

このコマンドを実行すると、出力が取得されます。

2)Sudo service supervisor restart

3
Lalit Baghel

実稼働環境ですでにNodeJSを実行しているユーザー向け。 PM2を使用してアプリプロセスを管理します。

# install
npm install -g pm2

# in project dir with your CI or dev setup tool 
# --name gives task a name so that you can later manage it
# -- delimits arguments that get passed to the script
pm2 start artisan --interpreter php --name queue-worker -- queue:work --daemon

NodeJSの開発とセットアップでVagrantを使用し、インラインvagrantスクリプトのみを使用してこのプロセスを実行します。

開発でPM2を使用する場合、多くのウォッチャーのいずれかを使用して再起動を管理できます。単にpm2 restart queue-worker変更を取得したとき。実稼働環境では、このアプローチはお勧めしません。むしろ、このプロセスに従うことができるビルドツールを選択します。

# 1. stop pm task to ensure that no unexpected behaviour occurs during build
pm2 stop queue-worker
# 2. do your build tasks
...
# 3. restart queue so that it loads the new code
pm2 restart queue-worker
3
dewwwald

Pm2を使用する

pm2 (Node.jsの高度なプロダクションプロセスマネージャー)でJSスクリプトを実行していました。これは私が実行していた唯一のものでした。しかし、実行を続けるプロセスがもう1つ得られました。

process.ymlを作成して、1つのコマンドで両方を実行しました。最初の実行がphp artisan queue: listenを実行することを確認します

# process.yml at /var/www/ which is root dir of the project
apps:
  # Run php artisan queue:listen to execute queue job
  - script    : 'artisan'
    name      : 'artisan-queue-listen'
    cwd       : '/var/www/'
    args      : 'queue:listen' # or queue:work
    interpreter : 'php'

  # same way add any other script if any.

今実行してください:

> Sudo pm2 start process.yml

pm2のその他のオプションと機能を確認してください

2
Lahar Shah

画面内でリスニングを開始するとどうなりますか?こちらをご覧ください: http://aperiodic.net/screen/quick_reference ログアウトしても、画面はアクティブで実行されたままです。デーモン化が機能しない理由はわかりません。

2
grasshopper

これはLaravel固有の質問なので、私はLravel固有の答えを提案すると思いました。このサーバーで既にcronjobsを使用しているため、シェルコマンドを繰り返しcronjobとして設定して、ワーカーが実行されていることを常に確認することをお勧めします。シェルコマンドを設定してサーバー上のcronをネイティブに実行するか、Laravel=コンソールカーネルを使用してコマンドを管理し、既に持っているかどうかを確認するなどのロジックを追加することができますワーカーが実行されていない場合は、先に進み、バックアップを開始します。

コマンドを実行する頻度に応じて、週に1回、または1分に1回という頻度で実行できます。これにより、スーパーバイザーなどのサーバーにオーバーヘッドを追加することなく、ワーカーが継続的に実行されていることを確認できます。スーパーバイザーなどのサードパーティのパッケージに信頼を与えれば許可を与えることは問題ありませんが、信頼する必要を回避できる場合は、代わりにこのアプローチを検討することをお勧めします。

これを使用して必要な処理を行う例としては、1時間ごとに実行されるcronjobがあります。カスタムLaravel=コンソールコマンド内から次の順番で実行します。

\ Artisan :: call( 'queue:restart');

\ Artisan :: call( 'queue:work --daemon');

これは、古いバージョンのLaravel(最大5.3))に適用されますが、新しいバージョンではテストしていません。

2
eResourcesInc

monit ツールを使用できます。非常に小さく、あらゆるタイプのプロセス管理および監視に役立ちます。

このリンク からバイナリパッケージをダウンロードした後、それをシステム上のフォルダーに抽出し、パッケージからシステムに2つのファイルをコピーしてインストールできます。

cd /path/to/monit/folder
cp ./bin/monit /usr/sbin/monit
cp ./conf/monitrc /etc/monitrc  

編集/etc/monitrcニーズに基づいて( reference doc )。次に、 init control file を作成して、起動時にmonitを有効にします。次のようにmonitを開始します。

initctl reload-configuration
start monit
1
Ghasem Pahlavan