我最近设置了一个Laravel Queue系统.基础是cronjob调用一个命令,它将作业添加到队列中并调用第二个发送电子邮件的命令.
当我进入我的服务器并运行php artisan队列时,系统工作:listen,但是如果我关闭我的终端,则监听器关闭,作业堆叠起来并排队,直到我重新进入并再次运行监听.
什么是让我的队列系统在后台运行而不需要通过ssh保持我的连接打开的最佳方法?
我尝试运行php artisan queue:work --daemon
,它完成了队列中的作业,但当我关闭终端时,它关闭了连接和后台进程.
1> Ben Swinburn..:
运行
nohup php artisan queue:work --daemon &
注销时会阻止命令退出.
尾随&符号(&)导致进程在后台启动,因此您可以继续使用shell,而不必等到脚本完成.
见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这样的东西来确保服务保持运行并在崩溃/失败后重新启动.
首先我需要:http://stackoverflow.com/a/29292637/470749然后`nohup php artisan queue:work --daemon> storage/logs/laravel.log&`为我工作.注意:如果你想杀死nohup守护进程,你需要先运行类似`ps -ef | grep artisan`的东西来发现它的PID.然后你可以运行`kill [pid]`http://stackoverflow.com/q/17385794/470749
2> Manish Nakar..:
你应该使用linux supervisor
安装很简单,在Ubuntu上我可以使用以下命令安装它:
apt-get install supervisor
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也会重新启动监听程序.
更多说明在这里,https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps
3> zeros-and-on..:
命令
nohup php artisan queue:work --daemon &
是正确的,它将允许进程在关闭SSH连接后继续; 但是,这只是一个短期的解决方案.重新启动服务器或任何问题导致进程停止后,您将需要返回并再次运行该命令.当发生这种情况时,你永远不知道.它可能发生在星期五晚上,因此最好实施长期解决方案.
我最终切换到Supervisord,这可以安装在Ubuntu上一样简单
sudo apt-get install supervisor
对于AWS-AMI或RedHat用户,您可以按照我在此问题中列出的说明进行操作:
在AWS AMI Linux服务器上设置Supervisord
该答案仅适用于Ubuntu用户,我的回答链接到一个单独的问题,如何在基于RedHat的发行版上进行设置.此外,我回答了Dev 15 2016,其他答案仅针对Ubuntu用户,于2017年6月发布.
4> Harry Bosh..:
来自https://gist.github.com/ivanvermeyen/b72061c5d70c61e86875
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;
}
}
5> Lalit Baghel..:
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
运行此命令时,获取输出queue-worker:added进程组
其他命令
1)sudo supervisorctl reload
运行此命令时获取输出重新启动主管
2)sudo service supervisor restart