我在远程计算机的文件夹中有一个python脚本。为了执行它,我从本地计算机进行ssh会话,转到该文件夹并运行。
我使用的命令:
ssh remotehost
user@remotehost:~$ cd /my/folder
user@remotehost:~$ python abc.py >> abc.log
现在问题是ssh会话。该脚本花费大量时间,并且由于互联网问题,ssh会话终止,脚本无法完成。假设遥控器始终处于运行状态。
我可以在不关心ssh会话终止的情况下运行脚本,并在需要时随时使用ssh进行tail -f abc.log
吗?
答案 0 :(得分:1)
这取决于要连接到的远程计算机上安装了哪些工具。我知道的两个主要工具是GNU屏幕和tmux。我使用屏幕,所以我将向您介绍如何使用该屏幕。在执行Python脚本之前,您可以正常开始并进入屏幕会话:
ssh remotehost
user@remotehost:~$ cd /my/folder
user@remotehost:~$ screen
user@remotehost:~$ python abc.py >> abc.log
然后您可以脱离屏幕会话,即使ssh连接丢失,python脚本也将继续运行。
要分离:
按Ctrl-A和d
要重新访问:
screen -r
要列出屏幕会话:
screen -ls
要终止当前的屏幕会话:
按Ctrl-d
有更多的功能要显示。这是入门的好资源:
有关更多详细信息,请参见手册:
答案 1 :(得分:1)
您可以在屏幕上运行脚本,也可以在nohup + bg中运行该进程。我总是更喜欢Screen,但让我解释这两种方法。
1。 nohup
您可以使用nohup命令通过像这样nohup python /my/folder/abc.py &
从终端分离来运行进程
默认情况下,这会创建 nohup.out 文件,该文件将存储所有日志。
如果您想要自定义文件,则可以使用重定向,它将是nohup python /my/folder/abc.py >> abc.log &
在单个命令中将是
ssh user@remotehost 'nohup python /my/folder/abc.py >> abc.log &'
2。屏幕
来自文档。
Screen是一个全屏窗口管理器,它在多个进程(通常是交互式外壳程序)之间多路复用物理终端。每个虚拟终端都提供DEC VT100终端的功能,此外,还提供ISO 6429(ECMA 48,ANSI X3.64)和ISO 2022标准的几种控制功能(例如,插入/删除行和对多个字符集的支持)。每个虚拟终端都有一个回滚历史记录缓冲区,以及一个允许用户在窗口之间移动文本区域的复制粘贴机制。
调用screen时,它将创建一个带有外壳的单个窗口(或指定的命令),然后不碍事,以便您可以正常使用该程序。然后,您可以随时创建带有其他程序(包括更多外壳程序)的新(全屏)窗口,杀死当前窗口,查看活动窗口的列表,打开和关闭输出日志记录,在Windows,查看回滚历史记录,在Windows之间切换等。所有Windows都完全独立于彼此运行它们的程序。当程序的窗口当前不可见时,即使整个屏幕会话都与用户终端分离,程序仍继续运行。
因此,您可以使用ssh直接在屏幕上运行脚本,然后可以随时通过将其附加到屏幕来查看日志,也可以将日志直接重定向到某个文件,或者使用tee重定向到文件和输出。
在屏幕上运行命令,并在stdout(终端)中打印输出。
ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py; exec bash")'
在屏幕上运行命令并将输出重定向到文件。
ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py >> abc.log &2>1; exec bash")'
在屏幕上运行命令,并将输出重定向到两个文件以及stdout(终端)。
ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py &2>1 |tee abc.log; exec bash")'
注意:以上所有命令中都需要exec bash,否则屏幕将在作业完成后终止。
以上任何一项命令都应该执行。
在上述所有情况下,您都可以使用screen -r ScreenName附加屏幕ScreenName并查看日志。
重定向到文件时,我总是建议stderr重定向。
关于使用Linux屏幕的一些参考