我想在后台运行一些命令,但同时我想查看输出以确保它运行良好。
我用它来执行一些操作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
到某个非临时终端,即不会自动断开连接的终端。最容易运行的是tmux
和screen
。
因此,您登录到您的服务器,启动新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
重新设置会话并在那里启动命令),您希望将脚本转换为“守护进程”,但这超出了本回答文章的范围。