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

Dan*_*Lin 13 bash zsh sh

我只是运行一个工作(假设 foo.sh)。

./foo.sh
[Press Ctrl-Z to stop]
bg  # enter background
Run Code Online (Sandbox Code Playgroud)

它生成输出到 stdout 和 stderr。有什么方法可以重定向到 stdout 和 stderr 到其他文件而不是当前屏幕?

s.w*_*ner 22

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

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

pgrep foo.sh
Run Code Online (Sandbox Code Playgroud)

然后你可以gdb用来附加到那个进程

gdb -p <PID>
Run Code Online (Sandbox Code Playgroud)

gdb然后在您更改此程序写入的位置

p dup2(open("/path/to/file",577, 420), 1)
p dup2(1, 2)
Run Code Online (Sandbox Code Playgroud)

然后你脱离进程并退出 gdb

detach
quit
Run Code Online (Sandbox Code Playgroud)

一点解释

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