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

Pet*_*r.O 85 gui command-line

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

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

有没有办法通过终端启动应用程序,这样就没有“挂机”效果,就像通过Alt+启动某些东西一样F2

我想让命令行立即再次可用,而不是在后台和终端中打印。

con*_*use 87

假设gedit您要独立运行的程序(又名“disowned”、“disentangled”、“decoupled”)。根据您想要做什么,有不同的方法:

程序已经在运行

否认:

disown -h如果您想使用已经运行的程序(即,如果您忘记了),nohup这是一种可行的方法。您首先必须使用Ctrl+停止它Z。然后您可以使用bg [jobId](例如bg 1)将其置于后台。您可以使用jobs. 之后,您可以使用disown -h %[jobId]. 示例终端会话:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit
Run Code Online (Sandbox Code Playgroud)

程序尚未启动

诺哈普

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

nohup gedit &
Run Code Online (Sandbox Code Playgroud)

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

子外壳:

您可以通过以下方式达到类似的效果

$ (geany >/dev/null 2>&1 &)
Run Code Online (Sandbox Code Playgroud)

括号打开一个新的子 shell 来运行 gedit。>/dev/null 2>&1将 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 Screen 的退出键
  • Alt-Pageup 向后滚动此窗口的历史记录
  • Alt-Pagedown 向前滚动此窗口的历史记录
  • Ctrl-a-! 打开或关闭所有 Byobu 的按键绑定

“at”守护进程和其他

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

echo './myprogram myoption1 myoption2' | at now
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*ick 27

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

firefox &!
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道,但这似乎仅限于 zsh。在 bash 中,您必须在后台启动命令后手动运行 `disown &lt;pid-of-command&gt;`。 (7认同)

小智 25

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

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

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

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1
Run Code Online (Sandbox Code Playgroud)

您可以在作业中查看进程,将其带回前台(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
Run Code Online (Sandbox Code Playgroud)

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

除了重定向和错误处理,这等价于htorque 的 answer

  • @fred:如果您一次在后台运行一个命令的多个实例,最好不要运行`jobs -p command`。您可以使用 `jobs` 找到正确的作业 ID,然后执行 `jobs -p &lt;job-id&gt;` 来获取作业的 PID。就我个人而言,我发现带有子外壳的版本要容易得多。;-) (2认同)
  • @htorque, fred:你可以不带参数运行 disown 来让 bash 不承认最后一个工作:`gedit &amp; disown` (2认同)

Flo*_*sch 20

nohup

nohup 是一个程序,它运行给定的命令而忽略挂断信号,以便该命令可以在其父进程终止后继续在后台运行。请参阅联机帮助页

例如:

nohup gedit something
Run Code Online (Sandbox Code Playgroud)

  • nohup 是一个程序,它运行给定的命令而忽略挂断信号,以便该命令可以在其父进程终止后继续在后台运行。请参阅 [手册页](http://manpages.ubuntu.com/manpages/natty/en/man1/nohup.1.html) (3认同)
  • 什么是“nohup”?请详细说明。 (2认同)
  • 当交互式 shell 收到 SIGHUP 信号时,可以向其所有子进程发送(或不发送,取决于设置)一个 SIGHUP 信号。当终端关闭时,这可能会发生(或不会再次发生)。未准备好处理此类信号的孩子将执行默认操作,即退出。`nohup` 应用程序(和内置的 `disown` bash)不允许信号到达应用程序。 (2认同)
  • 需要注意的一件事是 `nohup` 在当前目录中创建一个名为 `nohup.out` 的文件。有关更多详细信息,请参阅 [手册页](http://manpages.ubuntu.com/manpages/natty/man1/nohup.1.html)。出于这个原因,我更喜欢 `disown`,并且因为在启动 `gedit` 后 `disown` 可以工作。 (2认同)

Oli*_*Oli 17

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

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

  1. 在终端中运行它,然后运行一些不断推送输出的东西。我使用 Django 开发服务器,但irssi甚至watch uptime是很好的例子。
  2. 杀死终端并开始一个新的终端。
  3. 快跑screen -r,轰隆隆,你又回来了。

screen比这大得多,您可以将其与byobu更好的终端体验结合起来。阅读。