【问题标题】:How to run Python scripts without connection to instance active on computer如何在不连接到计算机上活动实例的情况下运行 Python 脚本
【发布时间】:2019-12-25 00:26:26
【问题描述】:

如果这是一个愚蠢的问题,我深表歉意;在云计算方面,我是一个完全的新手。 我正在使用 Google Compute 实例来运行支持 GPU 的 python 脚本。不幸的是,似乎要运行脚本,我的计算机必须打开,并且将我连接到我的实例的终端必须打开。 我想知道是否有任何方法可以完全远程地在 Google Cloud 中的实例上运行 python 脚本,并且只需 SSH 即可查看脚本何时完成。

我考虑过使用 IPython 笔记本或类似的东西,但我正在运行的代码需要一个非常特定的 Anaconda 环境,并且旨在通过终端运行。

编辑 1:

我认为我需要让控制台将我连接到实例的原因是因为我试图通过编写一个小脚本来测试它每分钟生成文件。我的过程如下: 1.创建实例,通过google cloud Instances页面SSH进入 2. 用这段代码创建一个新的python脚本:

import time

i=0
while 1:
    tmp_file = open("tst"+str(i)+".txt","w")
    tmp_file.write(str(i))
    tmp_file.close()
    i += 1
    time.sleep(60)
  1. 然后我运行了这段代码,通过使用不同的控制台 SSH 确认它可以正常工作。
  2. 我关闭了运行程序的控制台。之后,文件停止创建。

理想情况下,我希望我可以运行这样的脚本,关闭终端窗口并使脚本的执行与我是否打开控制台或我的设备是否打开等事情无关。我希望能够在脚本完成后通过 SSH 登录并查看脚本的结果。

【问题讨论】:

    标签: python-3.x google-cloud-platform google-compute-engine


    【解决方案1】:

    不知道你为什么说你必须保持终端连接到你的compute instance。更多细节会有所帮助。您是否通过终端手动 SSH 到您的实例并运行脚本?这就是你想在未来这样做的方式吗?

    如果您定期运行脚本,可以将其设置为cron job

    您可能还想查看 Cloud Functions 以实现无服务器。

    【讨论】:

    • 所以,我创建了一小段测试代码,看看我是否必须为实例保留控制台。查看帖子中的编辑
    【解决方案2】:

    您可以使用 tmux 之类的程序。

    # ssh to the system
    ssh user@system-blah-blah
    
    # start a new tmux session
    tmux new -s my_remote_session
    
    # detach from session (keyboard shortcut, in sequence)
    <ctrl-b> d
    
    # attach to it back
    tmux a -t my_remote_session
    

    【讨论】:

    • 根据他们的README,看起来 tmux 仅适用于 OpenBSD、FreeBSD、NetBSD、Linux、OS X 和 Solaris。你知道一些适用于 Ubuntu 系统的东西吗?这就是我设置的虚拟机正在使用的。
    • Ubuntu 是一个 Linux 发行版。只需尝试“sudo apt-get install tmux”来安装它。
    【解决方案3】:

    在 GCE 和 Python 方面,我也是个新手,所以你们相处得很好!我在学习使用 GCE 时遇到了类似的问题。我选择使用启动脚本,但我不确定它是否适合您需要设置的环境。我的使用 bash 启动脚本,看起来像这样:

    #! /bin/bash
    
    sudo apt-get update
    sudo apt-get -yq install python-pip
    sudo pip install --upgrade google-cloud
    sudo pip install --upgrade google-cloud-storage
    sudo pip install --upgrade google-api-python-client
    sudo pip install --upgrade google-auth-httplib2
    
    echo "Making directories..."
    
    mkdir -p /home/<username>/rawdata
    mkdir -p /home/<username>/processeddata
    mkdir -p /home/<username>/input
    mkdir -p /home/<username>/code
    mkdir -p /home/<username>/and so on
    
    echo "Setting ownership..."
    
    sudo chown -R <username> /home/<username>
    
    echo "Directory creation complete..."
    
    gsutil cp gs://<bucket with code>/* /home/<username>/code/
    
    echo "Boot complete."
    
    nohup python /home/<username>/code/workermaster.py &
    

    代码的要点(如果它不是不言自明的!)是实例安装了各种包来支持代码,但其中一些可能默认在 GCE 实例上。然后它会设置所需的目录并从存储桶中复制所有需要的代码并设置所有权。我猜关键行是包含启动python脚本的“ho hangup”的那一行。

    我的“workermaster”脚本从存储桶中获取任务,并将输出放在实例上的一个文件夹中。我可以通过查看日志从控制台查看实例在做什么(因此无需通过 SSH 连接到实例中)。我的实例还将输出复制到输出存储桶。如果我通过 SSH 连接到实例,我看不到脚本正在运行,我只能看到文件“神秘地”出现在输出文件夹中。

    这里有很多专家可能会根据您的需求发布更具体的解决方案,但到目前为止,上述内容对我有用。祝你好运!

    【讨论】:

    • 这对我有用!对于任何有同样问题的人,只需在我的 python 命令解决问题之前添加“nohup”。即使没有连接到 VM,我现在也可以运行 python 脚本,然后 ssh 回来查看结果!
    【解决方案4】:

    为了能够让脚本运行并关闭终端窗口,您可以使用screen session,这将让脚本运行(在屏幕会话内),如果您关闭终端,它将继续工作,之后,您可以再次打开终端并连接到屏幕会话以查看结果。

    其他选项是使用ansible,它有助于在虚拟机内部运行命令而无需连接到它,但您必须创建一个SSH-key才能连接到ansible。

    【讨论】:

      猜你喜欢
      • 2018-02-02
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 2015-07-31
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多