将后台作业的 stdout/stderr 从控制台重定向到日志文件?

将后台作业的 stdout/stderr 从控制台重定向到日志文件?

我刚刚运行一项工作(假设foo.sh)。

./foo.sh
[Press Ctrl-Z to stop]
bg  # enter background

并且它会将输出生成到 stdout 和 stderr。是否有任何方法可以将 stdout 和 stderr 重定向到其他文件而不是当前屏幕?

答案1

显然我第一次误读了你的问题,所以这是我更新后的答案:

将程序发送到后台后,首先必须找到它的 PID

pgrep foo.sh

然后你可以使用它gdb来附加到该进程

gdb -p <PID>

然后你gdb改变这个程序写入的位置

p dup2(open("/path/to/file",577, 420), 1)
p dup2(1, 2)

然后你脱离这个过程并退出gdb

detach
quit

一点解释

  • 577相当于O_CREAT|O_WRONLY|O_TRUNC
  • 420相当于S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
  • 因此,调用open打开文件并将其截断为 0 字节(如果存在)或创建一个具有正确文件权限的新文件(如果不存在)
  • 第一次调用dup2复制对文件描述符的调用返回的文件描述符open1stdout
  • 第二次调用将dup2文件描述符复制12(即stderr

相关内容