在远程主机上运行脚本而不关心 ssh 会话

Sus*_*rma 3 python ssh tail remote-access

我在远程计算机的文件夹中有一个 python 脚本。为了执行它,我从本地计算机创建一个 ssh 会话,转到该文件夹​​并运行。

我使用的命令:

ssh remotehost
user@remotehost:~$ cd /my/folder
user@remotehost:~$ python abc.py >> abc.log
Run Code Online (Sandbox Code Playgroud)

现在问题是 ssh 会话。该脚本需要花费大量时间,并且由于互联网问题,ssh 会话终止且脚本未完成。假设遥控器始终启动并运行。

我可以运行脚本而不关心 ssh 会话终止并tail -f abc.log随时使用 ssh 吗?

Man*_*ani 6

您可以在屏幕中运行该脚本,也可以在 nohup+bg 中运行该进程。我总是更喜欢 Screen,但让我解释一下这两种方法。

1. 诺哈普

您可以使用 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 &'
Run Code Online (Sandbox Code Playgroud)

nohup 维基百科

2. 屏幕

来自文档。

Screen 是一个全屏窗口管理器,它在多个进程(通常是交互式 shell)之间复用物理终端。每个虚拟终端都提供DEC VT100 终端的功能,此外还提供ISO 6429(ECMA 48、ANSI X3.64)和ISO 2022 标准的多种控制功能(例如插入/删除行以及对多个字符集的支持)。每个虚拟终端都有一个回滚历史缓冲区,以及允许用户在窗口之间移动文本区域的复制粘贴机制。

当 screen 被调用时,它会创建一个带有 shell(或指定命令)的单个窗口,然后不妨碍您,以便您可以像平常一样使用该程序。然后,您可以随时创建新的(全屏)窗口,其中包含其他程序(包括更多 shell)、终止当前窗口、查看活动窗口列表、打开和关闭输出日志记录、在之间复制文本窗口,查看回滚历史记录,在窗口之间切换等。所有窗口完全独立地运行其程序。当程序的窗口当前不可见时,甚至当整个屏幕会话与用户终端分离时,程序仍会继续运行。

屏幕手册

因此,您可以使用 ssh 直接在屏幕中运行脚本,然后您可以在需要时通过附加到屏幕来查看日志,也可以将日志直接重定向到某个文件,或者使用 tee 重定向到文件和输出。

在屏幕中运行命令并在 stdout(终端)中打印输出。

ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py; exec bash")'
Run Code Online (Sandbox Code Playgroud)

在屏幕中运行命令并将输出重定向到文件。

ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py >> abc.log &2>1; exec bash")'
Run Code Online (Sandbox Code Playgroud)

在屏幕中运行命令并将输出重定向到文件和标准输出(终端)。

ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py &2>1 |tee abc.log; exec bash")'
Run Code Online (Sandbox Code Playgroud)

注意:在上述所有命令中,都需要 exec bash,否则一旦作业完成,屏幕将终止。

上述任何一个命令都可以完成这项工作。
在上述所有情况下,您可以使用 screen -r ScreenName 附加屏幕 ScreenName 并可以查看日志。
我总是建议在重定向到文件时使用 stderr 重定向。

关于使用linux screen的一些参考

  1. 管理 Linux 终端的 10 个 Screen 命令示例
  2. 如何使用 Linux 屏幕