我正在尝试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
。