即使在注销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守护进程的工作