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


78

有些GUI应用程序可以通过Terminal命令行正常启动,但有些则不能,它们导致Terminal等待应用程序终止。即使那样,有些也不“释放”命令行。

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

有没有一种方法可以通过终端启动应用程序,从而没有“挂断”效果,就像通过Alt+ 启动某些东西一样F2

我想立即再次使用命令行,而后台中仍然没有任何内容,并且无法在终端中进行打印。


应htorque的要求,我删除了他接受的答案。能不能请您选择其他的回答(你必须先取消选择htorque的-应该在红色的页面的底部潜伏)
奥利

1
处理程序已经运行的方法(由con-f-use概述)对于这种情况是好的,但是由于我的主要问题是关于干净启动且没有终端混乱,我已经接受screen(Oli提到)和RobinJ)。它的能力给我留下了深刻的印象。阅读它,并试图出来后......它只需要的打字:screen -d -m gedit(或screen geditCtrl+a d脱离)......我仍然有充分的机会来gedit中的终端视图(警告信息等),通过在任何时候screen -r,即使我同时关闭了原始终端窗口...
Peter.O 2011年

顺便说一句,您归因于终端的某些事情实际上是由外壳程序完成的,例如解释&命令后缀。这可能有助于澄清:终端,控制台,命令行管理程序和命令行之间有什么区别?
wjandrea

Answers:


17

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

对于其他事情,其他人所说的也行得通。我是...的粉丝nohup。但是,如果您需要一个终端,可以将其拆下然后重新连接,请看一下screen

  1. 在终端中运行它,然后运行一些继续推动输出的操作。我使用Django开发服务器,但irssi甚至watch uptime会是一个很好的例子。
  2. 杀死终端并启动一个新终端。
  3. 运行,screen -r然后BOOM,您又回来了。

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


这是我对屏幕功能的首次真正见解...感谢终端提示...
Peter.O 2011年

屏幕不再可用,但是tmux可以代替屏幕。(tmux开始新的tmux会话,按ctrl + b,然后按d分离,然后tmux附加以重新附加)
Gman Smith

84

假设gedit您要分离运行您的程序(又名“ disown”,“ disentangled”,“ decoupled”)。有多种方法,具体取决于您要执行的操作:

程序已经运行

拒绝:

disown -h如果要使用已经运行的程序(即,如果您忘记了nohup该程序),可以采用这种方法。您首先必须使用Ctrl+ 停止它Z。然后,您可以使用bg [jobId](例如bg 1)将其置于后台。您可以使用来获取正在运行的作业及其jobId的列表jobs。之后,您可以使用将它与终端解耦disown -h %[jobId]。终端会话示例:

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

程序尚未启动

Nohup

nohup并非总是出现在所有机器上。如果您知道要预先解耦,请使用:

nohup gedit &

也许你会想重定向外壳输出,以及和你的程序的伪输入源,所以:nohup ./myprogram > foo.out 2> bar.err < /dev/null &。您可能希望将输出重定向为不被它烦扰或在以后使用。空输入可以帮助防止ssh这样的启动。

子壳:

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

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

方括号将打开一个新的子>/dev/null 2>&1外壳以在其中运行gedit。重定向会将外壳输出重定向到无处(抑制输出)。而&在结束并将其进程在后台运行。

终端多路复用

也可以使用screenbyobu进行终端多路复用。您基本上是在自己的终端中运行该程序。我真的可以出于其他原因推荐byobu。下面列出了一些可能适合您的第一步的快捷方式:

有用:

  • 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守护程序和其他

at是一个很好的有用的小工具,可以在计划的时间运行命令。从外壳分离命令可能是“误用”的:

echo './myprogram myoption1 myoption2' | at now

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


提示:如果只有一项工作,则工作ID是可选的,例如,bg %1您可以键入代替bg
MasterMastic

25

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

它确实是,而且通常是您想要的。如果忘记使用&,则可以使用ctrl-z挂起程序,然后使用bg命令将其放在后台-并继续使用该shell。

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

some-program </dev/null &>/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 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的答案


好的,谢谢...看来,ctrl-z(挂起)可以让我再次访问命令行,但是会清空GUI,直到我发出bg似乎未挂起的GUI 。(很有意义)...还有另一个命令可用来分离GUI ...哈!现在,我明白了您的意思了sighals (kill command)……(这些信号使事情变得有趣)..我使用了一个代码片段来dd逐步输出其统计信息。并且它使用了kill+ SIGNAL ...是否有特定的信号来分离“作业” “?
Peter.O 2010年

我只是注意到您对Rick的回答的评论...我尝试了 disown jobs -p gedit``,并且似乎删除了该工作....(但是当我手动关闭gedit时,我在终端中收到系统消息...我目前有一个拧紧的终端...进行过多的实验 :(
Peter.O 2010年

@fred:作业由外壳程序管理,因此没有信号可以控制它。您可能会发现最好启动几个外壳程序-几个GUI终端允许使用制表符,并且您可以使用screen或tmux。

2
@fred:jobs -p command如果您一次在后台运行一个命令的多个实例,则最好不要运行。您可以jobs用来查找正确的作业ID,然后执行操作jobs -p <job-id>以获取作业的PID。我个人觉得带有subshel​​l的版本要容易得多。;-)
扭矩

2
@htorque,弗雷德:您可以运行不带参数的disown来使bash放弃上一份工作:gedit & disown

22

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

firefox &!

6
很高兴知道,但这似乎仅适用于zsh。在bash中,您必须disown <pid-of-command>在后台启动命令后手动运行。
htorque

有趣的是...我将研究zsh,但作为Linux新手,我现在将坚持使用bash ...谢谢
Peter.O 2010年

感叹号有什么作用?
关于natty的坚果,2013年

1
!会从终端进程中中断应用程序进程,因此您可以关闭终端而无需关闭时启动的应用程序。这似乎是zsh的事情,但是很方便。
瑞克(Rick)2013年

但这在bash中也起作用@htorque ....所以我想这不是问题。
Jasser

20

采用 nohup

nohup是运行给定命令而忽略了挂断信号的程序,因此该命令在其父进程终止后可以继续在后台运行。请参阅手册页

例如:

nohup gedit something

2
什么nohup啊 请详细说明。
Oxwivi

3
nohup是运行给定命令而忽略了挂断信号的程序,因此该命令在其父进程终止后可以继续在后台运行。请参阅联机帮助
弗洛里安Diesch

实际上,我认为我的答案在这里不正确。进一步考虑,nohup应在这种情况下使用。
boehj 2011年

2
当交互式外壳程序收到SIGHUP信号时,可以向其所有子级发送(或不发送,取决于设置)SIGHUP信号。当终端关闭时,可能会(或不会再次)发生这种情况。未准备好处理此类信号的孩子将执行默认操作,即退出。该nohup应用程序(和disownbash的内置)不允许信号到达应用。
enzotib

2
要注意的一件事是nohup在当前目录中创建一个名为的文件nohup.out。有关更多详细信息,请参见手册页disown出于这个原因,并且disown在您启动后就可以使用,因此我更喜欢gedit
Flimm

4

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


什么是GNU屏幕?
Oxwivi

如果我正确地理解了这个想法,那是一种用于命令行的窗口管理器。它允许您在命令行界面会话中一次运行多个程序。
RobinJ 2011年

o
Oxwivi

像这样,只有Byobu才更容易使用。如果我错了,那么Byobu只是GNU Screen的一个简单界面。
RobinJ 2011年



0

许多人认为,nohup是要考虑的事情。但是nohup剧照仍然在终端上保持打开状态,并在终端上显示程序活动,这很烦人。之后,您可以仅关闭终端以避免这种情况。我发现了一个非常简单的解决方法,可以使用。

nohup gedit & exit

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


0

即使在脚本中也可以使用(就像别名一样,脚本中通常不允许'&'尾部,因为它们不是交互式的):

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.