当前位置: 首页>>技术问答>>正文


如何清理通过终端启动GUI应用程序(所以它不等待终止)?

,

问题描述

一些GUI应用程序通过终端命令行干净地启动。

有些不这样做,并且导致终端等待应用程序终止。 …即使如此,有些不要”release”的命令行。

神秘的&符号”&”后缀,似乎会导致终端将进程置于后台…(但我不确定那里会发生什么)。

有没有办法通过终端启动应用程序,以便没有”hang on”效果? …就像通过F2启动某些东西一样。

我希望立即再次提供命令行(没有任何东西在后台,并在终端中写出系统消息)。

最佳解决办法

在gedit的情况下,我只是一直打开一个副本。只要你有一个现有的副本运行,从终端启动gedit调用,然后关闭终端不会杀死gedit。

对于其他事情,其他人所说的也会起作用。我是nohup的忠实粉丝……但是如果你需要一个终端,你可以分离,但是然后re-attach到,你想看看screen

  1. 在终端中运行它,然后运行一些可以保持输出的东西。我使用Django开发服务器,但irssi甚至watch uptime都是很好的例子。

  2. 杀死终端并开始新的终端。

  3. 运行screen -r和BOOM,你回来了。

screen比这更大,您可以将它与byobu结合使用,以获得更好的终端体验。阅读周围。

次佳解决办法

假设gedit是要运行分离的程序(又名”disown”,”disentangle”,”decouple”)。根据你想要做什么,有不同的方法:

程序已经运行

断绝关系:

disown -h是如果你想用已经运行的程序来做到这一点(即如果你忘了nohup它)。您首先必须使用Ctrl + Z停止它。然后,您可以使用bg [jobId](例如bg 1)放入支架。您可以使用jobs获取正在运行的作业的列表。之后,您可以使用disown -h %[jobId]将其与终端分离。示例终端会话:

confus@confusion:~$ gedit 
^Z
[1]+  Stopped                 gedit
confus@confusion:~$ jobs
[1]+  Stopped                 gedit
confus@confusion:~$ bg 1
[1]+ gedit &
confus@confusion:~$ disown -h %1
confus@confusion:~$ exit

程序尚未启动

nohup

nohup并不总是出现在所有机器上。如果你知道你想事先解耦,你可以使用:

nohup gedit &

也许你会想重定向shell输出,你的程序也是一个伪输入源,所以:nohup ./myprogram > foo.out 2> bar.err < /dev/null &。你会希望将输出重定向到不被它烦恼或稍后使用它。 null-input可以帮助防止ssh中的混乱。

子shell:

你可以通过获得类似的效果

confus@confusion:~$ (geany 2>&1 /dev/null &)

方括号打开一个新的子shell来运行gedit。2>&1 /dev/null将shell输出重定向到无处(抑制输出)。最后&将该过程置于后台。

终端复用

也使用screenbyobu进行终端多路复用。你基本上在自己的终端上运行程序。我真的可以为其他原因推荐byobu。下面是boybu-shortcuts的列表,它可能在您的第一步中派上用场:

有用:

  • F2创建一个新窗口

  • F3移至下一个窗口

  • F4移至上一个窗口

  • F6从会话中分离并注销

  • Shift-F6从会话中分离,但不注销

  • F7进入回卷/搜索模式

  • Ctrl-F5重新连接任何SSH /GPG套接字或代理

不太有用:

Shift-F2水平分割屏幕 – Ctrl-F2垂直分割屏幕 – Shift-F3将焦点移至下一个分割 – Shift-F4将焦点移至上一个分割 – Shift-F5折叠所有分割 – F5刷新所有状态通知 – F8重命名当前窗口 – F9启动Byobu配置菜单 – F12 GNU屏幕的退出键 – Alt-Pageup在此窗口的历史记录中向后滚动 – Alt-Pagedown向前滚动此窗口的历史记录 – Ctrl-a-!打开或关闭所有Byobu的按键绑定 –

‘at’ deamon等

at是在预定时间运行命令的一个很好用的小工具。它可以是’misused’从shell分离一个命令:

echo './myprogram myoption1 myoption2' | at now

你也可以看看setsidstart-stop-daemon,但其他方法应该足够了。

第三种解决办法

The mysterious ampersand “&” suffix, seems to cause the terminal to put the process into the background… (but I’m not sure what happens there).

它确实,而且往往是你想要的。如果您忘记使用&;您可以使用ctrl-z暂停程序,然后使用bg命令将其置于后台 – 并继续使用该shell。

进程的stdin,stdout和stderr仍然连接到终端;您可以根据需要将/从/dev /null或其他任何文件(例如,保存输出日志)重定向到/dev /null。

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

您可以在作业中看到进程,将其带回前台(fg命令),并发送信号(kill命令)。

一些图形程序将从终端分离;如果是这样的话,当你运行命令”normally”时,你会注意到它启动了图形程序和”exits”。


这里是a short script,你可以把它放在我命名为runbg的~/bin中:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

我在重定向之前查找程序($ prog),因此可以报告找到它的错误。运行它为“runbg your-command args …”;如果需要将输出保存到某处,仍然可以将stdout /err重定向到文件。

除了重定向和错误处理外,这相当于htorque’s answer

第四种办法

使用nohup

nohup is a program that runs a given command with hangup signals ignored, so that the command can continue running in the background after its parent process terminates. See the manpage

例如:

nohup gedit something

第五种办法

要启动应用程序并将其从启动的终端中分离出来,请使用&!。

firefox &!

第六种办法

打开终端,键入屏幕,输入要运行的命令,关闭终端。该程序应该继续在GNU屏幕会话中运行。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1027.html,未经允许,请勿转载。