如何从远程 shell 获取输出

如何从远程 shell 获取输出

我有一个在服务器上运行的应用程序,从命令行启动。有时,我需要通过 SSH 连接到服务器并获取从应用程序写入 stdout 的输出消息。有没有办法读取/嗅探/捕获该终端上的消息?服务器运行 Fedora 12。

澄清一点。我拥有服务器的管理员访问权限,但我无法停止正在运行的应用程序,因为它处于关键环境中。最终用户从终端启动应用程序。通过 ssh,每当用户看到奇怪的行为时,我都必须读取终端中的消息。它是一个图形应用程序。我可能会构建一个脚本来使用屏幕运行应用程序,这意味着我必须更改“启动器”,但出于安全原因,有些服务器并不总是可以从 LAN 外部访问。更新很复杂。我的问题是,如果有一个应用程序正在运行,有什么方法可以在终端中捕获其输出而不停止它并在屏幕下重新运行或其他什么?

答案1

显而易见的解决方案是将应用程序的输出重定向到一个文件,然后查看该文件:

nohup application >app.log &  # on the server
ssh server tail -n +1 -f app.log   # on the client

如果应用程序必须在终端中输出,请在以下位置运行它屏幕

在服务器上:
screen -S somename -Rrd
application
Ctrl+A D从屏幕会话中“分离”,使其在后台运行

来自客户:
ssh server
screen -S somename -Rrd 重新连接到屏幕会话

如果您希望自动录制消息,最好的方法是使用标准日志设施。您可以安排将日志条目发送到其他计算机,可以使用最基本的系统日志来粗略地发送,也可以使用更好的过滤和调度选项来发送系统日志

答案2

我认为在这种情况下,比将输出重定向到文件更好的是将其重定向到命名管道(fifo),因为不需要将所有数据存储在磁盘上。如果程序产生大量输出,我们可能会耗尽磁盘空间。

命名管道使用文件系统,而不是传统的未命名 shell 管道。它是使用 mkfifo() 或 mknod() 显式创建的,两个独立的进程可以按名称访问管道 - 一个进程可以作为读取器打开它,另一个进程可以作为写入器打开它。

mkfifo /path/to/my/pipe
someprogram > /path/to/my/pipe
tail -f /path/to/my/pipe

如果您还想将其输出到标准输出,您可以使用tee

someprogram | tee /path/to/my/pipe

答案3

我正在寻找一种确实需要以特殊方式启动服务器的解决方案,因为我不允许启动程序,甚至无法在特殊环境中停止和重新启动。有人在服务器上启动程序,当出现问题时我必须检查终端中的消息输出。知道如何实现吗?

相关内容