无限地在后台运行Python脚本

时间:2017-06-19 06:34:41

标签: postgresql python-3.x events docker background-process

我正在尝试编写一个在另一台服务器上运行的python脚本,这样即使我在我的PC终端上关闭我的服务器连接,它也会继续在该服务器上运行。当脚本保持活动状态时,它会运行无限地监听网站(UI)上的任何事件,在事件发生时,它会适当地启动某些泊坞窗并继续监听PosgreSQL事件。

当我尝试使用nohup(在后台运行脚本)时,它确实在后台运行但无法收听任何事件。以前有没有人在做类似的事情?请分享你的想法。 我正在分享我的剧本的一部分。

self.pool = await asyncpg.create_pool(user='alg_user',password='algy',database='alg',host='brain',port=6543)
        async with self.pool.acquire() as conn:
            def enqueue_listener(*args):
                self.queue.put_nowait(args)

            await conn.add_listener('task_created', enqueue_listener)
            print("Added the listener")
            while True:
                print("---- Listening for new job ----")
                conn2, pid, channel, payload = await self.queue.get()
                x = re.sub("[^\w]", " ",  payload).split()
                print(x)
                if x[5] == '1':
                    tsk = 'TASK_ID=%s' % str(x[1])
                    if x[3] == '1':
                        command = "docker run --rm -it -e ALGORITHM_ID=1 -e TASK_ID=%s --network project_default project/docked_prol:1.0" % (str(x[1]))
                        subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)

                    if x[3] == '8':
                        command = "docker run --rm -it -e ALGORITHM_ID=8 -e TASK_ID=%s --network project_default project/docked_pro:1.0" % (str(x[1]))
                        subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)

当手动保持运行时,脚本运行得非常好,但只需要一些实施方法的建议。

2 个答案:

答案 0 :(得分:0)

只有在不提供外部输入的情况下自动运行进程/脚本,才能通过nohup在后台运行某些内容,因为无法为后台进程提供手动输入。 首先,尝试检查进程是否仍在后台运行(ps -fe | grep processname)。

如果它正在运行,请检查'nohup.out'文件以查看进程陷入困境的位置。这将在您启动该进程的同一目录中生成。这将让您了解流程中的内容。

答案 1 :(得分:0)

首先,三年后我来到这里。

要将脚本作为后台任务无限运行,您需要流程管理器工具。 PM2是我最喜欢用nodejs制作的流程管理器工具,但由于它是CLI,因此可以运行任何终端任务。

  1. 基本上,您可以安装NodeJ和npm到达pm2。 (您可以访问NodeJs.org下载安装程序。)

  2. 您需要在终端上使用npm install -g pm2将pm2作为全局模块安装

  3. 您可以通过pm2 -v

    检查它是否已安装
  4. 然后,您可以使用pm2 start file_name.py

    在终端上启动python脚本
  5. 它将在后台创建一个线程来运行您的脚本,并将永远重启。

  6. 如果您执行的操作花费了很多时间,并且您不想看到终端上正在运行的任务,则可以通过在命令中添加参数 --no-autorestart来禁用重新启动。 (#pm2 start file_name.py --no-autorestart

  7. 如果要查看日志或任务状态,可以只使用pm2 statuspm2 logspm2 monit

  8. 如果要停止任务,可以使用pm2 stop task_name

  9. 您可以使用pm2 reload allpm2 update重新启动所有任务

  10. 您可以使用pm2 kill

    终止任务

有关更多信息,您可以访问PM2 Python Documentation