我正在尝试编写一个在另一台服务器上运行的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)
当手动保持运行时,脚本运行得非常好,但只需要一些实施方法的建议。
答案 0 :(得分:0)
只有在不提供外部输入的情况下自动运行进程/脚本,才能通过nohup在后台运行某些内容,因为无法为后台进程提供手动输入。 首先,尝试检查进程是否仍在后台运行(ps -fe | grep processname)。
如果它正在运行,请检查'nohup.out'文件以查看进程陷入困境的位置。这将在您启动该进程的同一目录中生成。这将让您了解流程中的内容。
答案 1 :(得分:0)
首先,三年后我来到这里。
要将脚本作为后台任务无限运行,您需要流程管理器工具。 PM2是我最喜欢用nodejs制作的流程管理器工具,但由于它是CLI,因此可以运行任何终端任务。
基本上,您可以安装NodeJ和npm到达pm2。 (您可以访问NodeJs.org下载安装程序。)
您需要在终端上使用npm install -g pm2
将pm2作为全局模块安装
您可以通过pm2 -v
然后,您可以使用pm2 start file_name.py
它将在后台创建一个线程来运行您的脚本,并将永远重启。
如果您执行的操作花费了很多时间,并且您不想看到终端上正在运行的任务,则可以通过在命令中添加参数 --no-autorestart
来禁用重新启动。 (#pm2 start file_name.py --no-autorestart
)
如果要查看日志或任务状态,可以只使用pm2 status
,pm2 logs
和pm2 monit
。
如果要停止任务,可以使用pm2 stop task_name
您可以使用pm2 reload all
或pm2 update
重新启动所有任务
您可以使用pm2 kill
有关更多信息,您可以访问PM2 Python Documentation