在进程启动后,使用命令行重定向其 STDERR / STDOUT?

2024-10-14 08:40:00
admin
原创
293
摘要:问题描述:在 shell 中你可以进行重定向> <等等,但是在程序启动之后怎么样呢?我之所以会问这个问题,是因为我的终端后台运行的一个程序不断输出烦人的文本。这是一个重要的进程,所以我必须打开另一个 shell 来避开这些文本。我希望能够>/dev/null或其他重定向,这样我就可以...

问题描述:

在 shell 中你可以进行重定向> <等等,但是在程序启动之后怎么样呢?

我之所以会问这个问题,是因为我的终端后台运行的一个程序不断输出烦人的文本。这是一个重要的进程,所以我必须打开另一个 shell 来避开这些文本。我希望能够>/dev/null或其他重定向,这样我就可以继续在同一个 shell 中工作。


解决方案 1:

除了关闭并重新打开你的 tty(即注销并重新打开,这也可能会终止过程中的一些后台进程)之外,你只剩下一个选择:

  • 使用 gdb 附加到相关进程,然后运行:

+ p dup2(打开(“/dev/null”, 0), 1)
+ p dup2(打开(“/dev/null”, 0), 2)
+ 分离
+ 辞职

例如:

$ tail -f /var/log/lastlog &
[1] 5636

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/pts/0
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog

$ gdb -p 5636
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Attaching to process 5636
Reading symbols from /usr/bin/tail...(no debugging symbols found)...done.
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f3c8f5a66e0 (LWP 5636)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2

(no debugging symbols found)
0x00007f3c8eec7b50 in nanosleep () from /lib/libc.so.6

(gdb) p dup2(open("/dev/null",0),1)
[Switching to Thread 0x7f3c8f5a66e0 (LWP 5636)]
$1 = 1

(gdb) p dup2(open("/dev/null",0),2)
$2 = 2

(gdb) detach
Detaching from program: /usr/bin/tail, process 5636

(gdb) quit

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/null
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog
lr-x------ 1 myuser myuser 64 Feb 27 07:36 4 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 5 -> /dev/null

您还可以考虑:

  • 使用screen;屏幕提供了几个虚拟 TTY,您可以在其中切换,而无需打开新的 SSH/telnet/等会话

  • 使用nohup;这允许您关闭并重新打开会话而不会丢失任何后台进程...进程。

解决方案 2:

这将做到:

strace -ewrite -p $PID

它不是那么干净(显示如下线条:)write(#,<text you want to see>),但是可以工作!


您可能也不喜欢参数缩写。要控制这种情况,请使用-s设置显示字符串最大长度的参数。

它捕获所有流,因此您可能需要以某种方式进行过滤:

strace -ewrite -p $PID 2>&1 | grep "write(1" 

仅显示描述符 1 调用。2>&1是将 STDERR 重定向到 STDOUT,因为strace默认情况下写入 STDERR。

解决方案 3:

将正在运行的进程的输出重定向到另一个终端、文件或屏幕:

tty
ls -l /proc/20818/fd
gdb -p 20818

在gdb中:

p close(1)
p open("/dev/pts/4", 1)
p close(2)
p open("/tmp/myerrlog", 1)
q

从bash终端分离正在运行的进程并保持其活动:

[Ctrl+z]
bg %1 && disown %1
[Ctrl+d]

解释:

  • 20818- 仅作为正在运行的进程 PID 的示例

  • p- 打印gdb命令的结果

  • close(1)- 关闭标准输出

  • /dev/pts/4- 写入终端

  • close(2)- 关闭错误输出

  • /tmp/myerrlog- 要写入的文件

  • q- 退出 gdb

  • bg %1- 在后台运行已停止的作业 1

  • disown %1- 从终端分离作业 1

  • [Ctrl+z]- 停止正在运行的进程

  • [Ctrl+d]- 退出航站楼

解决方案 4:

借鉴 vladr (和其他人) 的出色研究:

在同一目录中创建以下两个文件,该目录位于您的路径中,例如 $HOME/bin:

silent.gdb,包含(来自vladr的回答):

p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit

和沉默,包含:

#!/bin/sh
if [ "$0" -a "$1" ]; then
 gdb -p $1 -x $0.gdb
else
 echo Must specify PID of process to silence >&2
fi
chmod +x ~/bin/silence  # make the script executable

现在,例如,下次您忘记重定向 Firefox 时,您的终端就会开始被不可避免的“(firefox-bin:5117): Gdk-WARNING **: XID 冲突,前方有麻烦”消息所困扰:

ps  # look for process xulrunner-stub (in this case we saw the PID in the error above)
silence 5117  # run the script, using PID we found

如果您不想看到它,您也可以将 gdb 的输出重定向到 /dev/null。

解决方案 5:

您可以使用 reredirect(https://github.com/jerome-pouiller/reredirect/)。

类型

reredirect -m FILE PID

并且输出(标准和错误)将写入文件中。

reredirect README 还解释了如何恢复进程的原始状态,如何重定向到另一个命令或仅重定向 stdout 或 stderr。

reredirect还提供了一个名为的脚本relink,允许重定向到当前终端:

relink PID
relink PID | grep useful_content

(reredirect 似乎具有与另一个答案中描述的 Dupx 相同的功能,但它不依赖于 Gdb)。

解决方案 6:

这不是对你的问题的直接回答,但这是我过去几天发现的有用的技巧:使用“屏幕”运行初始命令,然后分离。

解决方案 7:

Dupx是一个简单的 *nix 实用程序,用于重定向已运行进程的标准输出/输入/错误。

https://www.isi.edu/~yuri/dupx/

解决方案 8:

这是基于前面答案的 bash 脚本部分,它在打开的进程执行期间重定向日志文件,它用作logrotate进程中的后记。

#!/bin/bash

pid=$(cat /var/run/app/app.pid)
logFile="/var/log/app.log"

reloadLog()
{
    if [ "$pid" = "" ]; then
        echo "invalid PID"
    else
        gdb -p $pid >/dev/null 2>&1 <<LOADLOG
set scheduler-locking on
p close(1)
p open("$logFile", 1)
p close(2)
p open("$logFile", 1)
q
LOADLOG
        LOG_FILE=$(ls /proc/${pid}/fd -l | fgrep " 1 -> " | awk '{print $11}')
        echo "log file set to $LOG_FILE"
    fi
}

reloadLog

更新:对于 gdb v7.11 及更高版本,或者需要此处set scheduler-locking on提到的任何其他选项,因为附加 gdb 后,它不会停止所有正在运行的线程,并且您可能无法因为文件使用情况而关闭/打开日志文件。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2588  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   31  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   26  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   21  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用