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

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

推荐答案

除了关闭和重新打开您的tty(即注销和重新登录,这也可能会终止进程中的一些后台进程)之外,您只有一个 Select :

  • 使用gdb连接到相关流程,然后运行:

例如.:

$ 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) 拆卸
Detaching from program: /usr/bin/tail, process 5636

(gdb) 退出

$ 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;screen提供了几个虚拟TTY,您无需打开新的SSH/telnet/etc会话即可在它们之间切换
  • 使用nohup;这允许您关闭和重新打开会话,而不会丢失...过程

Linux相关问答推荐

Docker 默认使用交换文件吗?

使用文件名重新打开 linux 管道(仅从一侧)

可以用openmp并行化内存分配删除吗? (c++)

Linux 如何使用 PCID 的值?

我有 ext2 格式的文件系统图像.我喜欢在终端中读取 Linux 特别是 Ubuntu 中的所有文件系统 struct 数据.有没有工具>

如何将执行的shell命令的结果存储在python的变量中?

-zxvf 在 tar -zxvf <文件名> 中是什么意思?

如何克隆 OpenLDAP 数据库

打印当前一周的星期一的日期(在 bash 中)

size_t 和 off_t 的用法有什么区别?

exec 系统调用(如 exec 和 execve)系列的功能有什么区别?

如何在不重新打印的情况下更新终端中的打印消息

如何使用文件描述符刷新写入?

如何找到只对所有者具有特定权限的文件?

初学者如何在 Linux 中开始使用 Mono?

如何使用 sed 通过灵活的键和值更改我的配置文件?

如何在 UNIX 中将字符串转换为整数

编译 OpenGL 程序 GL/glew.h 缺失

带有日期和时间的 Linux 命令历史记录

linux脚本杀死java进程