当我跑步时
apt-get -y upgrade
我通常会看到这样的输出:
"the following packages will be upgraded..."
我使用ctrl+z和bg
将进程置于后台,但即使我运行其他命令,其输出也会出现在 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
标准输出现在应该转到该文件。
此方法可能不适用于更复杂的程序,可能由于安全限制、缺少调试器信息、可能导致可怕的损坏等而无法实现。