Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

啟動 & 停止 Laravel queue worker in Bash

Posted on 2023 年 4 月 2 日2023 年 4 月 2 日 By 日落 在〈啟動 & 停止 Laravel queue worker in Bash〉中有 5 則留言

Laravel 的 queue worker 與 Horizon 需要透過 artisan queue:work 在背景執行,若可以的話,再使用 systemd 或 supervisor 來監控運作狀態。

不過 systemd 和 supervisor 都需要 root 權限來操作,說起來蠻麻煩的,所以寫了一小段 shell script 來啟動與停止,沒辦法在 worker 中斷時 restart,但可以做 graceful start & shutdown。

啟動 queue worker:

./artisan queue:work \
    --no-interaction --no-ansi >> storage/logs/queue.log 2>&1 &

# 透過 $? 來檢查指令執行是否成功
if [ $? -ne 0 ]; then
    echo "FAILED !"
else
    echo "OK"
fi

停止所有的 queue worker:

# queue:restart 會送訊號給所有的 worker 來 graceful shutdown
./artisan queue:restart --quiet --no-ansi

# 檢查是否所有的 proccess 都停止
while [ 1 ]; do
    QUERY="$(ps -ef | grep queue:work | grep -v grep)"
    if [ -z "${QUERY}" ]; then
        break
    else
        sleep 1
    fi
done
echo "OK"

Laravel Horizon 的操作相對簡單一些。

啟動 Horizon:

./artisan horizon \
    --quiet --no-interaction --no-ansi >> storage/logs/horizon.log 2>&1 &

if [ $? -ne 0 ]; then
    echo "FAILED !"
else
    echo "OK"
fi

停止 Horizon:

artisan horizon:terminate --quiet --no-interaction --no-ansi

# 檢查 proccess 是否終止
while [ 1 ]; do
	QUERY="$(ps -ef | grep horizon | grep -v grep)"
	if [ -z "${QUERY}" ]; then
		echo "OK"
	else
		sleep 1
	fi
done
Tags:Bash, Laravel, Linux

文章導覽

Previous Post: Laravel Horizon 僅支援 queue in Redis
Next Post: whois 查詢 domain record

Comments (5) on “啟動 & 停止 Laravel queue worker in Bash”

  1. 小吳表示:
    2023 年 4 月 5 日16:15

    queue:restart 字面上看起來是重新啟動,好像不算是停止?

    回覆
    1. 日落表示:
      2023 年 4 月 5 日16:31

      文字上是「重新啟動」,但自己測試時,僅會停止現有的 worker 但不會再次 start

      回覆
    2. 日落表示:
      2023 年 4 月 5 日18:53

      剛剛翻了一下 code

      artisan queue:restart 的 source file 在 Illuminate\Queue\Console\RestartCommand.php,執行以後,會在 cache 寫一個 timestamp。

      而 Illuminate\Queue\Worker.php 的 getTimestampOfLastQueueRestart 中會去檢查 cache data,但是在哪裡會中斷、重新執行我還沒追到,這個檔案太肥了 Orz

      回覆
  2. 日落表示:
    2023 年 4 月 5 日18:55

    看起來是在 Worker.php 的 stopIfNecessary() 中,會停止,但是似乎不會啟動

    另外 worker 啟動時,會去檢查 cache 取得 queue 停止的時間,應該是透過這個機制取得最後執行的 job(s)

    回覆
  3. 日落表示:
    2023 年 4 月 18 日12:43

    唔 …. 好像應該加個 nohup …

    回覆

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


其他

關於我  (About me)

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.