【问题标题】:How to Start a Service, run a job and then shut down the service in Linux Terminal?如何在 Linux 终端中启动服务、运行作业然后关闭服务?
【发布时间】:2019-01-26 18:26:20
【问题描述】:

作为Linux 和 Bash 菜鸟,如果问题太基本或缺少某些关键信息,我们深表歉意。

基本上,我使用python-celery library(带有redis代理)来并行处理一些大量的json文件。

现在,我实现这一点的方法是(如果有更好的方法,请告诉我)

1号航站楼

$celery worker -A celery_worker -l info -c 64 #To start the celery worker service which listens for input

2号航站楼

$./pythonScript.py arg1 arg2 #Script to call the service

在终端 2 中完成任务后,我通过 Ctrl+C 向终端 1 发送键盘中断,然后工作人员关闭。

但是我如何通过在终端中运行单个 bash 脚本来完成整个事情,即启动 celery_worker 服务,运行 python 脚本,然后关闭工作程序?

作为肮脏的解决方法,我可以让工作程序运行24*7 而无需关闭工作程序,并且只要我需要服务就使用 python 脚本。但我相信这会浪费内存,而且芹菜工人有一种恼人的倾向,就是一段时间后会自行关闭。

我还需要将整个过程添加到每日 cron 作业中。

【问题讨论】:

    标签: python-3.x bash celery tmux keyboardinterrupt


    【解决方案1】:

    如果我理解正确,终端 2 依赖于终端 1。好的,所以你可以做的是编写一个 Bash 脚本,首先是 checks whether the celery worker is running。如果worker没有运行,那么start the worker as a background process并继续下一步。如果worker正在运行,则直接进行下一步。

    上面的下一步是运行 Python 脚本。

    完成之后,find the worker process,获取它的 PID(进程 ID),然后杀死它。这不是最干净的方式,但它对应于您现在使用 Ctrl + C 执行的操作。

    要设置 cronjobs,请查看 this page

    【讨论】:

    • 谢谢,但是在没有键盘中断的情况下关闭 celery worker 的干净方法是什么?我知道,kill 听起来像是一个不优雅的退出,但是当进程等待任务队列时,我该如何保持干净呢?
    • 最干净的方法是找出如何访问 celery worker 中的某些退出命令(如果有的话)。这听起来很有希望:docs.celeryproject.org/en/latest/userguide/… 实际上,如果 celery worker 构建正确,Ctrl + C 并没有什么问题。当工人正在做某事并且“只是让他的工作未完成”时,可能会出现问题,从而保持资源打开或半处理。判断你的用例,我相信这对你来说不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多