【问题标题】:How do you temporarily hide the output of a bash script that is running?如何暂时隐藏正在运行的 bash 脚本的输出?
【发布时间】:2013-09-02 16:11:01
【问题描述】:

这个问题可能已经被问过,也可能没有被问过,我在任何地方都找不到它,而且我是一个 Linux 初学者。

我有一个在我的 RHEL 4 服务器上运行的 ./start.sh 脚本,它每隔一秒发送一次跟踪输出。示例:跟踪:在别名 1、2 等上运行的服务器...用于确保服务器没有退出。

我需要运行一些 DDoS 保护工具和扫描程序,因为它们是同时运行的。尽管由于所有跟踪输出,我无法看到发生了什么!

我将如何暂时禁用输出,因为它已经在运行,同时保持它在后台运行,然后运行我的工具,然后当我再次重新启用输出时?

【问题讨论】:

  • 这与 SO 无关,但使用 Ctrl-z 停止工作,然后使用 bg 将其作为背景。然后,当您希望再次查看消息时,使用fg 将其再次带回前台。
  • 实际上将其放入 bg 不会阻止消息发送到当前终端。
  • Ctrl+Z 似乎并没有停止工作。当我输入 bg 时,它说“bg:当前:没有这样的工作”,当我输入作业时它什么也没显示,但我仍然得到跟踪输出。我的每个脚本都有 & ,所以很混乱。

标签: linux bash rhel


【解决方案1】:

我可以看到两种解决方案:

  • 使用screen(最好),或者
  • 使用重定向和tail

例如:

$ stdbuf -oL ./start.sh > /tmp/start.sh.log &
$ tail -f /tmp/start.sh.log

完成此操作后,您可以在终端中看到日志消息。您可以随意杀死tail,并在您想查看消息时重新启动它。当日志文件变得太大时,您可以使用以下命令将其缩短为零:

$ echo -n > /tmp/start.sh.log

Bash 的重定向可以无缝处理突然被截断的文件。不确定这是否适用于所有贝壳。如果您的 shell 出现问题,您可以插入 tee

我添加了 stdbuf -oL 以“鼓励”将 shell 脚本添加到行缓冲区 stdout。那里的任何缓冲自己的输出的命令都不会受到影响,但它可能会有所帮助。

【讨论】:

  • 我尝试了重定向和尾部,但它似乎不起作用。我所有的脚本都像... cd /home/game1/game ./gameserver gameserver.conf gameserveralias.conf> game1.log & sleep 16 游戏服务器是为 linux 制作的 java/c# 程序,不知道是什么包括但它是发送跟踪消息的那个,我不想摆脱它,只想隐藏一分钟。我要试试屏幕,我真的很感谢所有的帮助。我会告诉你进展如何,如果可行,我会接受你的回答。谢谢。
  • 尝试重定向stdout和stderr,比如./start.sh >& /tmp/start.log./start.sh > /tmp/start.log 2>&1
  • RHEL4 真的很老了,但仍然有 screen RPM,例如:packages.endpoint.com/rhel/4/os/i386/screen-4.0.2-6.i386.rpm
  • @Siqko:可能是缓冲问题。我正在更新答案以解决它。
  • 出于某种原因,它说 stdbuf 不是命令。 RHEL4 问题?感谢您为我提供的所有帮助。我的 RPM 似乎不起作用,将在其上运行 WinSCP 并尝试一下。
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2022-11-28
  • 2013-04-16
  • 2014-12-18
相关资源
最近更新 更多