如何通过终端干净地启动GUI应用程序?

一些GUI应用程序通过终端命令行干净地启动,但有些没有,它们会导致终端等待应用程序终止。 即便如此,有些人并没有“释放”命令行。

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

有没有办法通过终端启动应用程序,以便没有“挂起”效果,就像通过Alt + F2启动一些东西?

我想立即再次使用命令行,后台没有任何东西,并在终端中打印。

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

对于其他事情,其他人所说的也会奏效。 我是nohup的粉丝…但如果你需要一个终端,你可以分离,但然后重新连接,你想看screen

  1. 在终端中运行它,然后运行一直保持输出的东西。 我使用Django开发服务器,但irssi或甚至watch uptime都是很好的例子。
  2. 杀死终端并开始新的终端。
  3. 运行screen -r和BOOM,你又回来了。

screen比这大得多,你可以将它与byobu结合起来,以获得更好的终端体验。 四处看看。

假设gedit是你想要分离的程序(又名“disowned”,“解开”,“解耦”)。 取决于您想要做什么,有不同的方式:

程序已经运行

断绝关系:

如果你想用已经运行的程序(即如果你忘了没有它),那么disown -h是你要走的路。 首先必须使用Ctrl + Z停止它。 然后你可以使用bg [jobId] (例如bg 1 )放入地下室。 您可以使用jobs获取其jobId的正在运行的作业列表。 之后,您可以使用disown -h %[jobId]将其与终端分离。 示例终端会话:

 $ gedit ^Z [1]+ Stopped gedit $ jobs [1]+ Stopped gedit $ bg 1 [1]+ gedit & $ disown -h %1 $ exit 

程序尚未开始

nohup的

nohup并不总是存在于所有机器上。 如果你知道你想要事先解耦,你会使用:

 nohup gedit & 

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

子shell:

你可以通过实现类似的效果

 $ (geany >/dev/null 2>&1 &) 

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

终端复用

还使用屏幕或byobu进行终端复用。 您基本上在自己的终端中运行程序。 我也可以出于其他原因推荐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 Screen的Escape键
  • Alt-Pageup滚动浏览此窗口的历史记录
  • Alt-Pagedown向前滚动此窗口的历史记录
  • 按Ctrl-A! 打开或关闭所有Byobu的键绑定

'at'守护进程和其他人

at是一个很好的有用的小工具,可以在预定的时间运行命令。 从shell中分离命令可能会被“误用”:

 echo './myprogram myoption1 myoption2' | at now 

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

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

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

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

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

您可以在作业中查看进程,将其恢复到前台(fg命令),然后发送信号(kill命令)。

一些图形程序将从终端分离; 如果是这种情况,当您“正常”运行命令时,您会注意到它启动图形程序 “退出”。


这是一个简短的脚本 ,您可以将它放在〜/ bin中 ,我将其命名为runbg:

 #!/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 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重定向到文件。

除了重定向和error handling之外,这相当于htorque的答案 。

使用nohup

nohup是一个运行给定命令且忽略挂起信号的程序,因此命令可以在父进程终止后继续在后台运行。 请参阅联机帮助页

例如:

 nohup gedit something 

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

 firefox &! 

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

这对我有用:

 $ (nohup gedit 2>/dev/null &) 

很多人都认为,nohup是值得考虑的事情。 但是nohup仍然在终端上打开,并在终端上显示程序活动,这令人恼火。 您可以在此之后关闭终端以避免这样做。 我发现了一个非常简单的解决方法,我使用它。

 nohup gedit & exit 

就是这样。 当gedit启动时,它会打开gedit并关闭终端。 由于gedit现在与终端无关,因此它保持活动状态。

这甚至可以在脚本中运行(与别名一样,脚本中通常不允许使用’&’预告片,因为它们不是交互式的):

 bash -i >/dev/null 2>&1 <<<'nohup gedit &' 

这对我有用:

 $ (some-program &) &>/dev/null # Examples: $ (gedit &) &>/dev/null $ (google-chrome &) &>/dev/null