我们正在从脚本运行gnome-terminal,如下所示:
gnome-terminal -t 'Program Console' -x telnet 10.1.1.50 3000
telnet命令导致命令行程序在远程计算机上运行,输出显示在gnome-terminal中。
当从在Ubuntu 12.04 32位上运行的Code :: Blocks IDE的10.05版本运行此脚本时,这可以正常工作:gnome-terminal命令不会阻止脚本。
然而,当它从Code :: Blocks版本13.12(在另一个安装)Ubuntu 12.04 32位运行时,它会阻塞。如果不是单击Gnome Launcher中的Code :: Blocks图标,而是从Code :: Blocks外部的gnome-terminal调用Code :: Blocks 13.12,它不会阻塞。
我想知道在没有--disable-factory的情况下调用gnome-terminal会导致什么阻塞。我们已经使用了gnome-terminal,查看了进程,组和会话ID:
ps -eo user,pid,ppid,ruid,rgid,euid,egid,suid,sgid,sess,cmd --forest
我看不出ID的任何显着差异,但我可以看到,当gnome-terminal没有阻塞时,telnet命令与Code :: Blocks位于不同的进程树中。
根据手册页,gnome-terminal联系激活名称服务器,除非使用了--disable-factory,因此Code :: Blocks 13.12可能会阻止gnome-terminal与名称服务器联系。除了对gnome-terminal手册页的引用之外,我无法在线找到有关名称服务器的任何信息。
有谁知道可能导致gnome-terminal阻止的原因?
我提到了--disable-factory,因为我们在其他地方使用了--disable-factory,这总是会导致gnome-terminal阻塞,直到它正在执行的命令完成。
这是telnet命令阻塞时ps(不重要的行被删除)的输出(Code :: Blocks版本13.12,从Gnome Launcher调用):
USER PID PPID RUID RGID EUID EGID SUID SGID SESS CMD
1000 3413 1 1000 1000 1000 1000 1000 1000 2853 gnome-terminal
1000 3417 3413 1000 1000 1000 43 1000 43 2853 \_ gnome-pty-helper
1000 3418 3413 1000 1000 1000 1000 1000 1000 3418 \_ bash
1000 3495 3418 1000 1000 1000 1000 1000 1000 3418 | \_ minicom
1000 3567 3413 1000 1000 1000 1000 1000 1000 3567 \_ bash
1000 5189 3413 1000 1000 1000 1000 1000 1000 5189 \_ bash
1000 8669 5189 1000 1000 1000 1000 1000 1000 5189 | \_ gtodo
1000 16384 3413 1000 1000 1000 1000 1000 1000 16384 \_ bash
1000 18195 3413 1000 1000 1000 1000 1000 1000 18195 \_ bash
1000 20713 3413 1000 1000 1000 1000 1000 1000 20713 \_ bash
1000 23255 20713 1000 1000 1000 1000 1000 1000 20713 \_ vi gnome-terminal-query-2
1000 23492 20713 1000 1000 1000 1000 1000 1000 20713 \_ ps -eo user,pid,ppid,ruid,rgid,euid,egid,suid,sgid,sess,cmd --forest
1000 23268 1 1000 1000 1000 1000 1000 1000 2853 codeblocks
1000 23482 23268 1000 1000 1000 1000 1000 1000 2853 \_ /bin/sh ./gdb-switcher -nx -fullname -quiet -args /storage/work/c/a/s/d/telnet_run_platform.sh
1000 23483 23482 1000 1000 1000 1000 1000 1000 2853 \_ /bin/sh ./telnet_debug_platform.sh
1000 23485 23483 1000 1000 1000 1000 1000 1000 2853 \_ gnome-terminal -t Program Console -x telnet 10.1.1.50 3000
1000 23489 23485 1000 1000 1000 43 1000 43 2853 \_ gnome-pty-helper
1000 23490 23485 1000 1000 1000 1000 1000 1000 23490 \_ telnet 10.1.1.50 3000
这是我们从gnome-terminal运行代码块时的输出:
USER PID PPID RUID RGID EUID EGID SUID SGID SESS CMD
1000 3413 1 1000 1000 1000 1000 1000 1000 2853 gnome-terminal
1000 3417 3413 1000 1000 1000 43 1000 43 2853 \_ gnome-pty-helper
1000 3418 3413 1000 1000 1000 1000 1000 1000 3418 \_ bash
1000 3495 3418 1000 1000 1000 1000 1000 1000 3418 | \_ minicom
1000 3567 3413 1000 1000 1000 1000 1000 1000 3567 \_ bash
1000 5189 3413 1000 1000 1000 1000 1000 1000 5189 \_ bash
1000 8669 5189 1000 1000 1000 1000 1000 1000 5189 | \_ gtodo
1000 16384 3413 1000 1000 1000 1000 1000 1000 16384 \_ bash
1000 18195 3413 1000 1000 1000 1000 1000 1000 18195 \_ bash
1000 20713 3413 1000 1000 1000 1000 1000 1000 20713 \_ bash
1000 23255 20713 1000 1000 1000 1000 1000 1000 20713 | \_ vi gnome-terminal-query-2
1000 23936 20713 1000 1000 1000 1000 1000 1000 20713 | \_ ps -eo user,pid,ppid,ruid,rgid,euid,egid,suid,sgid,sess,cmd --forest
1000 23686 3413 1000 1000 1000 1000 1000 1000 23686 \_ bash
1000 23748 23686 1000 1000 1000 1000 1000 1000 23686 | \_ codeblocks
1000 23924 23748 1000 1000 1000 1000 1000 1000 23686 | \_ /usr/local/bin/gdb -nx -fullname -quiet -args /storage/work/c/a/s/d/telnet_run_platform.sh
1000 23931 3413 1000 1000 1000 1000 1000 1000 23931 \_ telnet 10.1.1.50 3000
(我们从Code :: Blocks调用的脚本gdb-switcher继续执行gdb,因此当gnome-terminal命令没有阻塞时,这就是代码块将此进程作为子进程的原因。)