如何在后台运行脚本,甚至在我注销 SSH 之后?

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

276734 次浏览

运行 nohup python bgservice.py &以获得忽略挂起信号并继续运行的脚本。输出将放在 nohup.out中。

理想情况下,您可以使用类似于 supervise的程序运行脚本,以便在它死亡时可以重新启动它。

你不能提高它,但我更喜欢 屏幕

您还可以使用几乎每个 Linux/Unix 系统都应该具有的 GNU 屏幕

如果你使用的是 Ubuntu/Debian,它的增强版 再见也相当不错。

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 的人不多,但是我推荐使用一个非常酷的 shell。

如果您已经启动了该进程,并且不想杀死它并在 nohup 下重新启动,那么可以将它发送到后台,然后断绝它。

Ctrl+Z(暂停进程)

(在后台重新启动进程

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

您可以考虑将 python 脚本转换为一个正确的 python 守护进程,如 给你所述。

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

如果您正面临 Python-daemon 的问题,那么还有另一个实用程序 主管可以为您提供同样的服务,但是在这种情况下,您不必编写任何代码(或修改现有代码) ,因为这是一个开箱即用的守护进程解决方案。

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

Superord 是一个非常棒的现成解决方案,可用于守护任何进程。它有另一个控制实用程序 supervisorctl,可以用来监视进程正在运行的主管。

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

在围绕 python-daemon 挠了几个小时之后,总监是在几分钟内就为我工作的解决方案。

希望这对尝试使 Python 守护进程工作的人有所帮助

下面是在 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

你也可以使用 亚普迪:

基本用法:

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')

试试这个:

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

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

现在可以通过 tail -f <your log file>.log跟踪 Python 脚本的日志

要终止脚本,可以使用 (法语)杀戮命令。

在后台运行 Python 脚本

首先,您需要在 Python 脚本中添加一行 开始吧代码,如下所示:

#!/usr/bin/env python3

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

chmod +x test.py

现在您可以使用忽略挂起信号的 没有运行该脚本。这意味着您可以在不停止执行的情况下关闭终端。另外,别忘了添加 &,这样脚本就可以在后台运行了:

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 PID

备选答案: tmux

  • 将 ssh 插入远程计算机
  • 输入 tmux到 cmd
  • tmux中启动你想要的进程,例如 python3 main.py
  • 通过 Ctrl+b然后 d离开 tmux会话

现在可以安全地退出远程计算机。当您返回时,使用 tmux attach重新进入 tmux会话。

如果您想开始多个会话,使用 Ctrl+b命名每个会话,然后 $。然后键入您的会话名称。

使用 tmux list-sessions列出所有会话

使用 tmux attach-session -t <session-name>附加正在运行的会话。