当前位置: 首页 > 面试题库 >

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

钱志义
2023-03-14
问题内容

在shell中,您可以执行重定向> <等操作,但是启动程序后如何呢?

这就是我问这个问题的方式,在我的终端后台运行的程序不断输出令人讨厌的文本。这是一个重要的过程,因此我必须打开另一个shell以避免输入文本。我希望能够进行>/dev/null重定向或其他重定向,以便可以继续在同一外壳中工作。


问题答案:

除非关闭并重新打开您的tty(即注销并重新登录,这可能还会终止该过程中的某些后台进程),否则您只剩下一个选择:

  • 使用gdb附加到有问题的进程,然后运行:
    • p dup2(open(“ / dev / null”,0),1)
    • p dup2(open(“ / dev / null”,0),2)
    • detach
    • quit

例如:

$ 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 / etc,会话的情况下进行切换
  • 使用nohup; 这样,您就可以关闭并重新打开会话,而不会丢失…进程中的任何后台进程。


 类似资料:
  • 很好的一天。我有一系列的命令,我想通过一个函数来执行,这样我就可以得到退出代码并相应地执行控制台输出。话虽如此,我这里有两个问题: 1) 我似乎无法将stderr指向/dev/null。 2) 在执行$1之前,不会显示第一条回显行。直到我运行需要一段时间才能处理的命令,比如在硬盘上搜索文件,我才真正注意到这一点。此外,情况显然是这样,因为输出如下所示: 换句话说,stderr显示在“尝试…$2”之

  • 我有和这个问题一样的问题,但不是在EC2环境中,只是简单地从命令行启动我的spring boot应用程序。我按照下面这个例子中的代码,成功地让我的应用程序在HTTPS上运行: 现在我可以在。 我希望会重定向到https。现在Chrome只是显示:“未收到数据”,这对用户不太友好。

  • 问题内容: 我有一个名为 我有一个手机网站 我想使用htaccess自动将主网站URL重定向到移动版本。 但是,移动版本上有一个指向主要网站的链接,称为 当我单击实际网站首页上的徽标时,它会链接到 我不希望通过单击主页上的徽标来意外允许用户返回移动设备。在没有JavaSCript的情况下,如何通过htaccess做到这一点。 如果没有,我会开放选择。 编辑 我想我目前将用它来通过htaccess感

  • 我将vault与我的Spring启动应用程序集成在一起,我面临着一个非常奇怪的问题。当我运行我的应用程序使用 运行成功但是当我使用 我得到以下例外。 有谁能给我简单描述一下两者的区别吗?非常感谢。

  • 问题内容: 如果我通过Java的ProcessBuilder类启动流程,则可以完全访问该流程的标准输入,标准输出和标准错误流(如Java 和)。不过,我不能找到一种方法,这些流无缝连接,和。 可以用来获取包含子流程的标准输出和标准错误的单个文件,然后循环遍历并通过我的标准输出将其发送出去,但是我找不到一种方法可以让用户输入到流程中,如果我使用C 调用,他或她可以。 Java SE 7发行时似乎有可