使用 bg 命令后可以像 nohup 一样重定向输出吗?

使用 bg 命令后可以像 nohup 一样重定向输出吗?

当我跑步时

apt-get -y upgrade

我通常会看到这样的输出:

"the following packages will be upgraded..."

我使用ctrl+zbg将进程置于后台,但即使我运行其他命令,其输出也会出现在 stdout 上。

是否可以像nohup这样将后台进程/命令的输出重定向到文件?

答案1

这种方法并不可取。不使用。如果它破坏了您的系统,您可以保留所有部分。

好的!还在我这儿?对于具有适当 include ( fcntl, for )的简单情况open,将标准重定向到其他地方(理论上)是可能的:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
    while (1) {
        printf("blat\n");
        sleep(1);
    }
    exit(EXIT_SUCCESS);
}

编译并运行:

$ cc -g    blat.c   -o blat
$ ./blat &

现在在其他一些终端中(鉴于调试器可以对实时进程执行的操作,这可能会由于各种明显的原因而运行违反安全策略的操作),使用为后台作业发布的 PID:

$ gdb -q -p 3727
...
(gdb) call close(1)
$1 = 0

看完之后close(2)我们确定成功了,标准输入已经关闭。让我们打开一个新文件...

(gdb) call open("/home/userrunningblat/blat.out", O_CREAT|O_WRONLY, 0666)
No symbol "O_CREAT" in current context.

拍得好。缺少这些符号的神奇数字是什么?在第三个终端中,使用我们方便的编译并执行某些 C 程序

$ cfu 'printf("%d\n", O_CREAT|O_WRONLY)'
65

或者您可以自己深入研究/usr/include目录并找出输入格式并按位或,但这非常烦人。 (另请注意,这些数字可能并且确实因操作系统而异。)返回gdb

(gdb) call open("/home/userrunningblat/blat.out", 65, 0666)
$2 = 1
(gdb) quit
$ tail -f blat.out

这意味着自从我们之前关闭了标准输出 ( 1) 这个open(2)调用已重用该文件描述符编号,因此在退出后,gdb标准输出现在应该转到该文件。

此方法可能不适用于更复杂的程序,可能由于安全限制、缺少调试器信息、可能导致可怕的损坏等而无法实现。

相关内容