 <p>I had the same issue.</p> <p>But I found another solution. I used the artisan worker as is, but I modified the 'watch' time. By default(from laravel) this time is hardcoded to zero, I've changed this value to 600 (seconds). See the file: 'vendor/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php' and in function 'public function pop($queue = null)'</p> <p>So now the work is also listening to the queue for 10 minutes. When it does not have a job, it exits, and supervisor is restarting it. When it receives a job, it executes it after that it exists, and supervisor is restarting it.</p> <p>==> No polling anymore!</p> <p>notes: </p> <ul> <li>it does not work for iron.io queue's or others. </li> <li>it might not work when you want that 1 worker accept jobs from more than 1 queue.</li> </ul>