如何通过终端干净地启动GUI应用程序?
一些GUI应用程序通过终端命令行干净地启动,但有些没有,它们会导致终端等待应用程序终止。 即便如此,有些人并没有“释放”命令行。
神秘的&符号&
后缀似乎会导致终端将进程置于后台(但我不确定那里会发生什么)。
有没有办法通过终端启动应用程序,以便没有“挂起”效果,就像通过Alt + F2启动一些东西?
我想立即再次使用命令行,后台没有任何东西,并在终端中打印。
在gedit的情况下,我只是一直打开一个副本。 只要你有一个现有的副本运行,从终端启动gedit
调用然后关闭终端将不会杀死gedit。
对于其他事情,其他人所说的也会奏效。 我是nohup
的粉丝…但如果你需要一个终端,你可以分离,但然后重新连接,你想看screen
。
- 在终端中运行它,然后运行一直保持输出的东西。 我使用Django开发服务器,但
irssi
或甚至watch uptime
都是很好的例子。 - 杀死终端并开始新的终端。
- 运行
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
您也可以查看setsid
和start-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