将 STDOUT 噪声与 ncurses 分离

将 STDOUT 噪声与 ncurses 分离

我正在尝试ncurses在 ARM 板上运行 GUI 应用程序。我正在使用串行控制台ttyAMA0端口运行它。但是当我运行 ncurses 程序时,在后台运行的其他进程将STDOUT在 GUI 布局上将调试消息(即 qDebug、qWarning)打印到 ie 中,从而导致噪音。我认为问题是因为所有进程都使用相同的控制台设备。

STDOUT那么是否有针对此问题的命令行或编程解决方案,以便我在GUI 上看不到其他进程ncurses

我尝试过 GNUscreen它并没有真正帮助。即使在屏幕会话中,我也看到这些进程的输出污染了屏幕

PS:我已经尝试过了数据库解决方案并且工作正常。但我想要替代解决方案

答案1

我认为你想要的不可能。请参阅标题为的超级用户线程:如何从终端完全分离进程?

我认为你基本上有 3 个选择。

选项1

运行污染终端的脚本,使其运行方式如下:

nohup somescript &> /dev/null &

应该将它们的 STDOUT 和 STDIN 运行到 /dev/null,将它们置于后台,如果您应该关闭终端,则将它们与终端信号断开连接。

选项#2

使用类似的东西screen。感谢评论中的@StephaneChazelas,看来确实有screen适用于您的架构上的 Debian 的软件包

选项#3

如果您不关心是否暂时暂停污染终端 STDOUT 的进程,您可以使用此设置:stty tostop。这会阻止这些进程将其 STDOUT 发送到您的终端。完成后,您可以使用命令重新启用它stty -nostop。我在Unix Power Tools 第三版书

例子

这是我的示例应用程序,它污染了我的终端的 STDOUT:

$ while [ 1 ];do echo hi 2>&1;sleep 5;done &

每 5 秒回显一次“hi”,如下所示:

[1] 30913
hi
$ hi
hi
hi
hi

现在当我跑步时stty tostop

$ stty tostop
$ date
Thu May  9 14:22:44 EDT 2013
$ date
Thu May  9 14:23:52 EDT 2013

这种方法的问题是其他进程被停止:

$ jobs
[1]+  Stopped                 while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done

这种方法的问题在于,它stty -tostop没有恢复该过程,只是设置了我stty声明再次允许 STDOUT 的设置。所以我必须手动恢复我的过程:

$ stty -tostop
$ jobs
[1]+  Stopped                 while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done

$ fg
while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done
hi
^Z

[1]+  Stopped                 while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done
$ bg
[1]+ while [ 1 ]; do
    echo hi 2>&1; sleep 5;
done &
$ hi
hi
hi
hi
hi

上面显示了我正在运行的stty -tostop,然后运行命令fg来前台while ...污染我的 STDOUT 的进程,然后Ctrl+ Z,停止该while ...进程,然后使用后台命令bg

额外的想法

查看这些 U&L 问答的建议工具

有大量的工具和可能的路径列表供您尝试作为screen.也许使用tmux或重新连接污染 STDOUT 的进程到另一个终端reptyr

相关内容