即使在我注销SSH后,如何在后台运行Python脚本?

时间:2010-06-04 15:39:40

标签: python service cron

我有Python脚本bgservice.py,我希望它一直运行,因为它是我构建的Web服务的一部分。即使在我注销SSH后,如何让它连续运行?

11 个答案:

答案 0 :(得分:186)

运行nohup python bgservice.py &以使脚本忽略挂断信号并继续运行。输出将放在nohup.out

理想情况下,您可以使用类似supervise的内容运行脚本,以便在(如果)它死亡时重新启动它。

答案 1 :(得分:26)

如果你已经开始这个过程,并且不想杀死它并在nohup下重启,你可以将它发送到后台,然后将其取消。

Ctrl+Z(暂停流程)

bg(在后台重启该过程

disown %1(假设这是作业#1,请使用jobs确定)

答案 2 :(得分:16)

你也可以使用几乎每个Linux / Unix系统应该拥有的GNU screen

如果你使用的是Ubuntu / Debian,它的增强变体byobu也相当不错。

答案 3 :(得分:10)

您可以考虑将python脚本转换为适当的python守护程序,如here所述。

python-daemon是一个很好的工具,可以用来运行python脚本作为后台守护进程而不是永远运行的脚本。您需要稍微修改现有代码,但其简单明了。

如果您遇到python-daemon的问题,还有另一个实用程序supervisor将为您执行相同操作,但在这种情况下,您不必编写任何代码(或修改现有代码),因为这是一个用于守护进程的开箱即用解决方案。

答案 4 :(得分:6)

你不能,但我更喜欢screen

答案 5 :(得分:5)

这是使用装饰器在python中的一个简单解决方案:

import os, time

def daemon(func):
    def wrapper(*args, **kwargs):
        if os.fork(): return
        func(*args, **kwargs)
        os._exit(os.EX_OK)
    return wrapper

@daemon
def my_func(count=10):    
  for i in range(0,count):
     print('parent pid: %d' % os.getppid())
     time.sleep(1)


my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own

您当然可以替换bgservice.py文件的内容来代替my_func

答案 6 :(得分:3)

zsh shell可以选择使用nohup运行所有后台进程。

~/.zshrc中添加以下行:

setopt nocheckjobs  #don't warn about bg processes on exit
setopt nohup        #don't kill bg processes on exit

然后你只需要运行这样的过程:python bgservice.py &,你不再需要使用nohup命令。

我知道没有多少人使用zsh,但我推荐这是一个非常酷的外壳。

答案 7 :(得分:1)

如果您需要的是该进程应该永远运行,无论您是否登录,请考虑将该进程作为守护进程运行。

supervisord是一个开箱即用的解决方案,可用于守护任何进程。它有另一个控制实用程序supervisorctl,可用于监视由主管运行的进程。

您不必编写任何额外的代码或修改现有脚本来使其工作。此外,详细的文档使这个过程更加简单。

在python-daemon周围搔了几个小时之后,主管是解决方案,在几分钟内就能为我工作。

希望这有助于某人尝试让python-daemon工作

答案 8 :(得分:1)

您还可以使用 Yapdi

基本用法:

import yapdi

daemon = yapdi.Daemon()
retcode = daemon.daemonize()

# This would run in daemon mode; output is not visible
if retcode == yapdi.OPERATION_SUCCESSFUL:
print('Hello Daemon')

答案 9 :(得分:1)

尝试一下:

nohup python -u <your file name>.py >> <your log file>.log &

您可以在屏幕中运行以上命令,然后退出屏幕。

现在,您可以通过以下方式尾随python脚本的日志:tail -f <your log file>.log

要杀死脚本,可以使用 ps -aux kill 命令。

答案 10 :(得分:1)

在后台运行 Python 脚本

首先,您需要在 Python 脚本中添加一个 shebang 行,如下所示:

#!/usr/bin/env python3

如果您安装了多个版本的 Python,则此路径是必需的,并且 /usr/bin/env 将确保采用 $$PATH 环境变量中的第一个 Python 解释器。您还可以对 Python 解释器的路径进行硬编码(例如 #!/usr/bin/python3),但这并不灵活,并且在其他机器上不可移植。接下来,您需要设置文件的权限以允许执行:

chmod +x test.py

现在您可以使用忽略挂断信号的 nohup 运行脚本。这意味着您可以在不停止执行的情况下关闭终端。另外,不要忘记添加 & 以便脚本在后台运行:

nohup /path/to/test.py &

如果您没有在文件中添加 shebang,您可以使用以下命令运行脚本:

nohup python /path/to/test.py &

输出将保存在 nohup.out 文件中,除非您像此处指定输出文件:

nohup /path/to/test.py > output.log &
nohup python /path/to/test.py > output.log &

如果您已将命令的输出重定向到其他地方 - 包括 /dev/null - 那就是它去的地方。

# doesn't create nohup.out

nohup command >/dev/null 2>&1   

如果您使用的是 nohup,这可能意味着您希望通过在整个过程的末尾放置另一个 & 在后台运行命令:

# runs in background, still doesn't create nohup.out

 nohup command >/dev/null 2>&1 &  

您可以使用以下命令找到 process 及其 process ID

ps ax | grep test.py

# or
# list of running processes Python

ps -fA | grep python

ps 代表 process status

如果你想停止执行,你可以用kill命令kill

kill PID