Cron作业卡在“正在运行”状态

本文针对Adobe Commerce cron作业未完成执行并持续处于“正在运行”状态时提供了解决方案,该状态会阻止其他cron作业运行。 发生这种情况的原因有很多,例如网络问题、应用程序崩溃和重新部署问题。

受影响的产品和版本

云基础架构上的Adobe Commerce,所有版本

症状 symptom

必须重置的cron作业的症状包括:

  • cron_schedule队列中出现大量作业
  • 网站性能开始降低
  • 作业无法按计划执行

解决方案 solutions

用于同时停止所有cron作业的解决方案 solution-stop-all-crons-at-once

WARNING
运行此命令而不使用--job-code选项会重置​ 所有 cron作业(包括当前正在运行的作业),因此我们建议仅在例外情况下使用它,例如,在您验证必须重置所有cron作业之后。 默认情况下,重新部署将运行此命令以重置cron个作业,以便在环境备份后正确恢复它们。 避免在索引器运行时使用此解决方案。

要解决此问题,必须使用cron:unlock命令重置cron作业。 此命令更改数据库中cron作业的状态,强制结束该作业以允许其他计划的作业继续执行。

  1. 打开终端并使用SSH密钥连接到受影响的环境。
  2. 获取MySQL数据库凭据: shell echo $MAGENTO_CLOUD_RELATIONSHIPS | base64 -d | json_pp
  3. 使用mysql连接到数据库: shell mysql -hdatabase.internal -uuser -ppassword main
  4. 选择main数据库: shell use main
  5. 查找所有正在运行的cron作业: shell SELECT * FROM cron_schedule WHERE status = 'running';
  6. 复制运行时间超过正常时间的任何作业的job_code
  7. 使用上一步中的计划ID解锁特定cron作业: shell ./vendor/bin/ece-tools cron:unlock --job-code=<job_code_1> [... --job-code=<job_code_x>]

用于停止单个cron的解决方案 solution-stop-a-single-cron

  1. 打开终端并使用SSH密钥连接到受影响的环境。

  2. 使用以下命令检查长时间运行的任务:

    date; ps aux | grep '[%]CPU\|cron\|magento\|queue' | grep -v 'grep\|cron -f'

  3. 在输出中,如下面的示例输出中,您将看到当前日期和进程列表。 START列显示进程的开始时间或日期:

    code language-none
    Wed May  8 22:41:31 UTC 2019
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root       590  0.0  0.0  27528  2768 ?        Ss   Jan15   0:49 /usr/sbin/cron -f
    bxc2qly+ 25855  0.0  0.0  23724  2184 ?        S    20:51   0:00 logger -d -u /run/bxc2qlykqhbqe_stg-cron.sock -p cron.info -s -t cron-bxc2qlykqhbqe_stg-bxc2qlykqhbqe_stg
    bxc2qly+ 25860 57.7  1.3 584220 222692 ?       S    20:51   0:02 php bin/magento cron:run
    bxc2qly+ 25863  0.0  0.0  23724  2472 ?        S    20:51   0:00 logger -d -u /run/bxc2qlykqhbqe-cron.sock -p cron.info -s -t cron-bxc2qlykqhbqe-bxc2qlykqhbqe
    bxc2qly+ 25876 53.0  0.6 475472 111468 ?       R    20:51   0:01 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe_stg/bin/magento cron:run --group=index --bootstrap=standaloneProcessStarted=1
    bxc2qly+ 25878 57.0  0.6 475472 112080 ?       R    20:51   0:01 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe_stg/bin/magento cron:run --group=staging --bootstrap=standaloneProcessStarted=1
    bxc2qly+ 25880 50.5  0.6 475472 111312 ?       R    20:51   0:01 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe_stg/bin/magento cron:run --group=catalog_event --bootstrap=standaloneProcessStarted=1
    bxc2qly+ 25882 48.5  0.6 475472 111220 ?       R    20:51   0:00 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe_stg/bin/magento cron:run --group=consumers --bootstrap=standaloneProcessStarted=1
    bxc2qly+ 25884 50.5  0.6 475472 111372 ?       R    20:51   0:01 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe_stg/bin/magento cron:run --group=ddg_automation --bootstrap=standaloneProcessStarted=1
    bxc2qly+ 25890 32.5  0.6 475368 110672 ?       R    20:51   0:00 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe/bin/magento cron:run --group=staging --bootstrap=standaloneProcessStarted=1
    bxc2qly+ 25892 34.5  0.6 475472 110724 ?       R    20:51   0:00 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe/bin/magento cron:run --group=catalog_event --bootstrap=standaloneProcessStarted=1
    bxc2qly+ 25894 31.5  0.6 475368 110136 ?       R    20:51   0:00 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe/bin/magento cron:run --group=consumers --bootstrap=standaloneProcessStarted=1
    bxc2qly+ 25896 29.0  0.6 475320 109876 ?       R    20:51   0:00 /usr/bin/php7.1-zts /app/bxc2qlykqhbqe/bin/magento cron:run --group=ddg_automation --bootstrap=standaloneProcessStarted=1
    
  4. 如果您看到长时间运行的cron作业可能属于块部署进程,则可以使用kill命令终止该进程。 您可以识别​ 进程ID(找到PID列),然后将PID放入命令中以终止该进程。
    终止进程 ​命令为:

    kill -9 <PID>

  5. 如果您尝试重新部署,则可以重新部署。

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a