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

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

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

理想情况下,你可以像supervise一样运行你的脚本,这样它可以在死的时候重新启动。

如果你已经开始了这个过程,并且不想在nohup下重新启动它,你可以把它发送到后台,然后断开它。

Ctrl+Z (暂停进程)

bg (在后台重启进程

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

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

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

您可以考虑将您的Python脚本转换为适当的python守护进程,如此处所述。

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

如果您在使用python守护进程时遇到问题,那么还有另外一个实用程序主pipe会为您执行此操作,但在这种情况下,您不必编写任何代码(或修改现有的代码),因为这是一个开箱即用的守护进程解决schemestream程。

你可以禁不住,但我更喜欢屏幕 。

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命令。

我知道没有多less人使用zsh,但它是一个非常酷的壳,我会推荐。

这里是一个简单的解决scheme,在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 

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

如果你需要的是不pipe你是否login,进程应该永远运行,考虑运行进程作为守护进程。

supervisord是一个很好的解决scheme,可以用来守护任何进程。 它有另一个控制实用程序supervisorctl ,可以用来监视正在由主pipe运行的进程。

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

在python-daemon周围抓了我几个小时之后,主pipe是在几分钟内为我工作的解决scheme。

希望这有助于有人试图使python守护进程的工作