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


110

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

Answers:


213

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

理想情况下,您可以使用类似的脚本来运行脚本,supervise以便在脚本终止时可以重新启动。


15
当我用nohup和&运行命令时,我收到消息nohup: ignoring in put and appending output to nohup.out'`,当我按Enter键时,该进程以状态1退出。这是怎么回事?
Santosh Ghimire

1
在nohup.out中读取输出。就我而言,这是一个权限问题,我需要使用sudo
mxns 2014年

以及如何以这种方法运行后停止bgservice?
在洞中射击

1
@Shaegorath将pid保存在某个位置,以便以后可以将信号发送到该进程。在执行somecommand &完某些shell(bash,zsh等)后,它将打印pid [1] 12345。否则您可以使用$!
Tony Beta Lambda

31

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

Ctrl+Z (暂停过程)

bg (在后台重新启动该过程

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



12

你可能会考虑把您的Python脚本到合适的蟒蛇守护进程,如所描述这里

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

如果您遇到python-daemon的问题,可以使用另一个实用程序管理器为您执行相同的操作,但是在这种情况下,您将不必编写任何代码(或修改现有代码),因为这是一种实现即用即用的解决方案流程。


简要说明如何解决问题通常是一个好主意。
Nikhil Sahu


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


1
也许有必要捕获SIGHUP信号。然后在您的块中添加signal.signal(signal.SIGHUP,handler)。
Chouettou

3

zsh的外壳有一个选项,以使与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的人并不多,但是我推荐它是一个非常酷的shell。


1

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

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

您无需编写任何额外的代码或修改现有的脚本即可完成此工作。此外,冗长的文档使此过程更加简单。

在围绕python-daemon抓了几个小时后,supervisor是在几分钟内为我工作的解决方案。

希望这可以帮助尝试使python-daemon工作的人



1

试试这个:

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

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

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

要杀死脚本,可以使用ps auxkill命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.