【问题标题】:Program shows console output even though stdout and stderr are redirected即使 stdout 和 stderr 被重定向,程序也会显示控制台输出
【发布时间】:2012-10-03 20:53:42
【问题描述】:

即使标准输出和标准错误都被重定向到 /dev/null,vncpasswd 程序如何在控制台上产生输出?

$ vncpasswd > /dev/null 2> /dev/null
Password: 

编辑:这是部分 strace:

open("/dev/tty", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(3, SNDCTL_TMR_CONTINUE or TCSETSF, {B38400 opost -isig icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig icanon -echo ...}) = 0
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(5, 0), ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig icanon -echo ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb7c3eda000
write(3, "Password: ", 10Password: )              = 10
read(3, 

【问题讨论】:

    标签: linux unix console


    【解决方案1】:

    它直接打开底层终端(类似于open("/dev/tty", ...))。再多的重定向也无法摆脱这一点。如果您不想看到它,则必须在不附加到 tty 的情况下运行它(例如通过 cron 或其他方式)。

    【讨论】:

      【解决方案2】:

      它会打开你的终端并在那里写:

      open("/dev/tty", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 3
      ...
      write(3, "Password: ", 10Password: )              = 10
      

      如果你想让它变得不可能,请在 setsid 下运行它。

      【讨论】:

        【解决方案3】:

        您只是将stderr 重定向到/dev/null 尝试使用vncpasswd &> /dev/null

        【讨论】:

        • 我希望它们都重定向到 /dev/null。
        • 现在我考虑了一下,您的原始答案也应该有效。对不起,我不知道为什么..
        猜你喜欢
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多