Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Laravel queue worker using systemd.
# Laravel queue worker using systemd
# ----------------------------------
#
# /lib/systemd/system/queue.service
#
# run this command to enable service:
# systemctl enable queue.service
[Unit]
Description=Laravel queue worker
[Service]
User=www-data
Group=www-data
Restart=on-failure
ExecStart=/usr/bin/php /path/to/laravel/artisan queue:work --daemon --env=production
[Install]
WantedBy=multi-user.target
@rask

This comment has been minimized.

Copy link

@rask rask commented Aug 7, 2017

artisan queue:restart makes the artisan queue:work process exit with a successful 0 exit code, which means the Restart value should be always instead of on-failure. I had problems keeping the worker running after a deployment (which called the queue:restart command) and I checked that on-failure was not the correct value to use.

Otherwise it seems to be working just fine, thanks!

@cmsouza

This comment has been minimized.

Copy link

@cmsouza cmsouza commented Aug 15, 2017

Also, the correct location of the file is on /etc/systemd/system/ not on /lib/systemd/system.

Those are the directories (https://wiki.archlinux.org/index.php/Systemd/User)

/usr/lib/systemd/user/ where units provided by installed packages belong.
~/.local/share/systemd/user/ where units of packages that have been installed in the home directory belong.
/etc/systemd/user/ where system-wide user units are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own units.
@Adesubomi

This comment has been minimized.

Copy link

@Adesubomi Adesubomi commented Jan 19, 2018

Please, how do I start the process after creating the file? And what is the Linux command to list all the running services, to know that it's running?

@jron82

This comment has been minimized.

Copy link

@jron82 jron82 commented Apr 30, 2018

Thanks for posting this. I just used it on a Centos 7 cPanel server.

The only catch I had was that I had to replace the www-data with the user and group the files were registered under as cPanel executes PHP under the system user name and not www-data.

Apart from that all I had to do to get it going was run:

systemctl enable laravel-queue.service

systemctl start laravel-queue.service

Also, when I made a change the service file I had to run:

systemctl daemon-reload

systemctl restart laravel-queue.service to restart it.

All in all, it was very easy, thanks!

@bertalanimre

This comment has been minimized.

Copy link

@bertalanimre bertalanimre commented Sep 18, 2018

For me it is not working. I constantly get the following:

[myuser@webserver laravel-project]$ systemctl status queuework
● queuework.service - Laravel queue worker
   Loaded: loaded (/etc/systemd/system/queuework.service; disabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Tue 2018-09-18 10:18:45 CEST; 4s ago
  Process: 25837 ExecStart=/usr/bin/php /var/www/html/laravel-project/artisan queue:work --daemon (code=exited, status=217/USER)
 Main PID: 25837 (code=exited, status=217/USER)

Sep 18 10:18:44 webserver systemd[1]: Unit queuework.service entered failed state.
Sep 18 10:18:44 webserver systemd[1]: queuework.service failed.
Sep 18 10:18:45 webserver systemd[1]: queuework.service holdoff time over, scheduling restart.
Sep 18 10:18:45 webserver systemd[1]: start request repeated too quickly for queuework.service
Sep 18 10:18:45 webserver systemd[1]: Failed to start Laravel queue worker.
Sep 18 10:18:45 webserver systemd[1]: Unit queuework.service entered failed state.
Sep 18 10:18:45 webserver systemd[1]: queuework.service failed.

The command works fine if I execute it from the terminal. So I've fixed it by:
as rask suggested, set the Restart option to always
and for start I've used a nohup command before php

This way it is working like a charm and also restarts if I kill the process manually. systemctl restart and stop also works.

# Laravel queue worker using systemd
# ----------------------------------
#
# /lib/systemd/system/queue.service
#
# run this command to enable service:
# systemctl enable queue.service

[Unit]
Description=Laravel queue worker

[Service]
User=nginx
Group=nginx
Restart=always
ExecStart=/usr/bin/nohup /usr/bin/php /var/www/html/laravel-project/artisan queue:work --daemon

[Install]
WantedBy=multi-user.target
@bertalanimre

This comment has been minimized.

Copy link

@bertalanimre bertalanimre commented Dec 4, 2019

I know this is a dead topic by now, but still gonna try to ask:
Anyone got to enable loging to a custom file? Like ./storage/logs/qworker/general.log ? How to add that to systemd? No matter what I try none works. :/

@svamja

This comment has been minimized.

Copy link

@svamja svamja commented Feb 3, 2020

Got these here:
https://unix.stackexchange.com/questions/321709/redirect-systemd-service-logs-to-file
https://www.freedesktop.org/software/systemd/man/systemd.exec.html

One should add:
StandardOutput=append:/path/to/project/storage/log/queue.log
StandardError=append:/path/to/project/storage/log/queue.log

I am going to try it.

@timrourke

This comment has been minimized.

Copy link

@timrourke timrourke commented Mar 20, 2020

For those looking for some basic answers about how to use systemd, Justin Ellingwood wrote some great tutorials on the Digital Ocean blog, here's one for example: https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal

These are excellent resources, def worth familiarizing yourself with systemd's high-level concepts and basic commands, especially since things like NGINX and PHP-FPM are probably running on your servers using systemd.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment