如何在后台运行命令并同时记录输出

如何在后台运行命令并同时记录输出

我想在后台运行一些命令,但同时我想查看输出以确保它运行良好。

我用它来执行一些操作wp-cli并保存输出。

答案1

如果我理解正确,“我想将输出保存在文本文件中”和“我想查看输出”,那么答案这里会有帮助的。

“该tee命令将标准输入复制到标准输出也适用于作为参数给出的任何文件。当您不仅想通过管道发送一些数据,而且还想保存副本时,这非常有用。”

您还可以在这里阅读更多内容:
https://www.gnu.org/software/coreutils/manual/html_node/tee-inspiration.html

使用 gustafbstrom 的简单示例:
program [arguments...] 2>&1 | tee outfile

因此,您可以在屏幕上看到命令的输出,同时将其保存在文件中。

答案2

您将“在后台运行”和“我想查看输出”两个问题混为一谈。

你必须退后一步,多思考一下问题。你真正想要的是什么?

根据我的收集,你真的想“在后台运行”。

您可以实现这两个目标,但其中一个目标必须优先并成为主要目标。其他的解决方案将由此通知。

由于“查看程序的输出”是相当微不足道的问题,因此无论您以何种方式解决它,请参阅其他讨论tee和重定向的答案。

正如我所说,我建议你首先关注“背景”。

第一个事实:你需要认识到unix中没有“背景”!

有一个守护进程的概念。然后还有“守护进程”的黑客攻击,但这两个都不意味着“背景”。

守护进程的概念即使在今天仍然成立,但“守护进程化”的概念却不然!今天(即 2022 年)我们拥有所有工具来将迟缓的“守护进程”扔出窗外。

守护进程是愚蠢的,它是 BSD 引入的错误,它根本不应该发生,它让新手们困惑了几十年。

另一方面,守护进程只是一个进程,它不仅仅处理单用户 io,也不限于单用户处理和用户会话绑定(有限)时间范围。守护进程只是无限期地运行,并且经常(但并非总是)处理多用户 io,并且不绑定到任何用户会话。但“前景”/“背景”不再重要了。

所以回到最初的说法:unix 中没有“背景”,只有两种可能性:进程的输出和输入连接到当前(您的)终端,或者它们连接到其他地方。

连接到当前终端的进程(即“前台” - 但请记住,这只是您的前台,Ben 有不同的前台,Casey 也是如此),当该终端断开连接时,自然会被终止。因此,任何未连接到可断开终端的东西都在“后台”运行。

我希望你能理解这个问题,不要感到困惑。如果没有,请重新阅读上面的段落,直到您明白为止。

因此,对于“后台”,您只需确保您正在运行的wp-cli实例未连接到任何临时终端。

终端仿真器终端、VT 登录终端和SSH 登录终端是短暂的,即它们是可断开的。因此,您需要做的就是将您“绑定”wp-cli到某个非临时终端,即不会自动断开连接的终端。最容易运行的是tmuxscreen

因此,您登录到您的服务器,启动新tmux会话并wp-cli从那里开始。如果您的 SSH 会话失败(网络问题),您的wp-cli运行仍将不受影响,因为它连接到“内部”tmux终端而不是 SSH 终端(该终端在网络故障时被破坏)。这样你就有效地实现了“背景化”。

现在,除非您想存档输出,否则您不需要任何其他内容,因为tmux具有滚动功能,因此您可以向后滚动(双关语)生成的所有行wp-cli(当然 tmux 限制记录的行数)。

如果您确实想存档输出,只需将wp-cli | tee wp-cli.log其在会话内形成即可tmux,现在您可以同时“观看和记录”输出。

screen类似tmux,但是年纪大了,智障多了,所以建议你看看tmux。另一方面,screen(在不同的破坏阶段)存在于更多系统上。选择是你的。

tmux是一个很棒的“平台”,可以在“后台”运行长时间的临时任务,这正是您所要求的方式。

不幸的是,有时,就像tmux临时/手动那样(例如每次服务器重新启动时,您必须tmux重新设置会话并在那里启动命令),您希望将脚本转换为“守护进程”,但这超出了本回答文章的范围。

相关内容