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

zih*_*oyu 102 python cron service

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

Edw*_*ale 196

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

理想情况下,您可以使用类似的方式运行脚本,supervise以便在(何时)它死亡时重新启动它.

  • 当我用nohup和&运行命令时,我收到消息`nohup:忽略put并将输出附加到'nohup.out'`当我按下enter时,进程退出状态1.发生了什么? (11认同)
  • 读取 nohup.out 中的输出。就我而言,这是一个权限问题,我需要使用 sudo (3认同)
  • 以及如何在该方法中运行 bgservice 后停止它? (2认同)

Mil*_*vić 36

在后台运行 Python 脚本

\n

首先,你需要添加一个shebang行,如下所示:

\n
#!/usr/bin/env python3\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
chmod +x test.py\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
nohup /path/to/test.py &\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
nohup python /path/to/test.py &\n
Run Code Online (Sandbox Code Playgroud)\n

输出将保存在nohup.out文件中,除非您指定输出文件,如下所示:

\n
nohup /path/to/test.py > output.log &\nnohup python /path/to/test.py > output.log &\n
Run Code Online (Sandbox Code Playgroud)\n

如果您已将命令的输出重定向到其他地方 - 包括/dev/null),那么它就会重定向到该位置。

\n
# doesn\'t create nohup.out\n\nnohup command >/dev/null 2>&1   \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
# runs in background, still doesn\'t create nohup.out\n\n nohup command >/dev/null 2>&1 &  \n
Run Code Online (Sandbox Code Playgroud)\n

您可以找到process及其process ID

\n
ps ax | grep test.py\n\n# or\n# list of running processes Python\n\nps -fA | grep python\n
Run Code Online (Sandbox Code Playgroud)\n

ps代表process status

\n

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

\n
kill PID\n
Run Code Online (Sandbox Code Playgroud)\n


Coo*_*per 28

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

Ctrl+Z (暂停过程)

bg (在后台重启该过程

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


小智 18

替代答案:tmux

  • ssh 进入远程机器
  • tmux在cmd中输入
  • tmux在eg内启动您想要的进程python3 main.py
  • 届时离开tmux会议Ctrl+bd

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

如果要启动多个会话,请使用Ctrl+bthen命名每个会话$。然后输入您的会话名称。

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

要附加正在运行的会话,请使用tmux attach-session -t <session-name>.


Dir*_*tel 17

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

如果你使用的是Ubuntu/Debian,它的增强版本byobu也相当不错.


Dus*_*and 10

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

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

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


Ran*_*tor 5

你可以没有它,但我更喜欢屏幕.


Cho*_*tou 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
Run Code Online (Sandbox Code Playgroud)

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

  • 也许有必要捕捉 SIGHUP 信号。然后在您的块中添加 signal.signal(signal.SIGHUP, handler)。 (2认同)

Sus*_*rma 5

尝试这个:

nohup python -u <your file name>.py >> <your log file>.log &
Run Code Online (Sandbox Code Playgroud)

您可以在屏幕中运行上述命令并退出屏幕。

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

要终止脚本,可以使用ps -auxKill命令。