【问题标题】:How to close a process's stdout and stderr without `disown` or gdb?如何在没有`disown`或gdb的情况下关闭进程的stdout和stderr?
【发布时间】:2011-08-25 20:34:37
【问题描述】:

我正在移植一些 bash 脚本以在busybox 上运行。他们使用disown,这在ash 中不受支持,然后杀死一些进程以防止来自该进程的消息出现在stdout/stderr 中。我想保留这个功能。这是否意味着关闭 stdout/sterr 或在其运行后重定向到 /dev/null

它是怎么做的?

【问题讨论】:

  • 你知道nohup cmd &,这有帮助吗?祝你好运。
  • 感谢您的评论。嗯,这没有帮助。
  • 对不起,但重读您的帖子,我仍然不清楚您要达到的目标。您能否编辑您的帖子以按顺序包含伪代码、预期输入(如果适用)和预期输出。这组脚本是作为守护程序运行还是从 crontab 运行?祝你好运。
  • 实现此目的的一种方法是编写一个过滤器,该过滤器将输出传递,直到它接收到某个信号,然后停止传递它。然后只需通过它管道其他程序。工作量超出理想范围,但考虑到限制,我看不到其他方法。

标签: linux shell portability sh


【解决方案1】:

exec [n]>&- 将关闭 FD [n]

【讨论】:

  • 你好,请问[n]是什么,是当前shell的1还是要disown的进程的stdin fd?你能举个完整的例子吗?
【解决方案2】:

一旦进程从该进程外部运行,您就无法修改文件描述符的重定向。这意味着您必须在 shell 创建进程时进行重定向。无论是重定向到文件还是像 Ignacio 显示的那样关闭 fds 都取决于您。

我不确定为什么你认为 bash 的 disown 内置对文件描述符有任何影响。以下是 bash 手册的内容:

拒绝 [-ar] [-h] [jobspec ...] 如果没有选项,则从表中删除每个作业规范 活跃的工作。如果 jobspec 不存在,并且 -a 和 -r 都不存在 提供时,使用 shell 的当前作业概念。如果 给出了 -h 选项,每个作业规范都不会从 ta- 中删除 ble,但被标记,以便 SIGHUP 不会发送到作业,如果 shell 收到一个 SIGHUP。如果不存在作业规范,并且两者都不存在 如果提供了 -a 或 -r 选项,则使用当前作业。 如果未提供作业规范,则 -a 选项表示删除或标记 所有工作;没有 jobspec 参数的 -r 选项限制 运行作业的操作。返回值为 0,除非有工作- spec 没有指定一个有效的工作。

但也许我对你想要达到的目标的理解是不完整的。

【讨论】:

  • 这种误解来自我正在移植的脚本。 devresources.linuxfoundation.org/dev/hotplug 他们有一个杀死 pid 的函数,但在这样做之前会调用 disown。它的副作用是不会将“进程:已终止”打印到终端。 Busybox ash 没有否认,所以我一直在寻找类似的东西。原来重定向 kill 的输出就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多