有些 GUI 应用程序可以通过终端命令行顺利启动,但有些则不然,它们会导致终端等待应用程序终止。即便如此,有些也不会“释放”命令行。
神秘的“&”&
后缀似乎会导致终端将进程置于后台(但我不确定那里发生了什么)。
有没有办法通过终端启动应用程序,这样就不会出现“挂起”效果,就像通过Alt+启动某个应用程序一样F2?
我希望命令行能够立即再次可用,而不是在后台保留某些内容并在终端中打印。
答案1
假设gedit
您想要以分离方式运行程序(又称“分离”、“解开”、“解耦”)。根据您想要执行的具体操作,有不同的方法:
程序已运行
放弃:
disown -h
是使用已运行程序执行此操作(即如果您忘记了它)的方法nohup
。首先必须使用Ctrl+停止它。然后您可以使用(例如)Z将其置于后台。使用 可以获得正在运行的作业及其 jobId 的列表。之后,您可以使用 将其与终端分离。终端会话示例: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
项目尚未开始
禁止
nohup
并非在所有机器上都存在。如果你事先知道要解耦,你可以使用:
nohup gedit &
也许您还想重定向 shell 输出,并将程序重定向为伪输入源,因此:nohup ./myprogram > foo.out 2> bar.err < /dev/null &
。您可能希望重定向输出,以便不被它打扰或稍后使用它。null-input 可以帮助防止 ssh 等出现故障。
子壳:
您可以通过以下方式实现类似的效果
$ (geany >/dev/null 2>&1 &)
括号打开一个新的子 shell 来运行 gedit。>/dev/null 2>&1
将 shell 输出重定向到任何地方(抑制输出)。&
最后的将进程置于后台。
终端复用
终端复用也使用屏幕或者屏风。您基本上可以在自己的终端中运行该程序。出于其他原因,我非常推荐 byobu。以下是 boybu 快捷方式列表,可能对您最初的步骤有用:
有用:
- 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 的 Esc 键
- Alt-Pageup 向后滚动查看此窗口的历史记录
- Alt-Pagedown 向前滚动查看此窗口的历史记录
- Ctrl-a-! 打开或关闭 Byobu 的所有按键绑定
‘at’ 守护进程及其他
at
是一款非常有用的小工具,可以在预定时间运行命令。它可能被“滥用”来将命令从 shell 中分离出来:
echo './myprogram myoption1 myoption2' | at now
您还可以研究setsid
和start-stop-daemon
,但其他方法就足够了。
答案2
要启动应用程序并将其与启动的终端分离,请使用 zsh 的 &!。
firefox &!
答案3
神秘的“&”符号后缀似乎会导致终端将进程置于后台……(但我不确定那里发生了什么)。
确实如此,而且通常也是您想要的。如果您忘记使用 &,可以使用 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 命令)。
一些图形程序会脱离终端;如果是这种情况,当你“正常”运行命令时,你会注意到它启动了图形程序和“退出”。
以下是一个简短的脚本,你可以把它放在〜/箱,我将其命名为 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 的回答。
答案4
对于 gedit,我只是一直保持一个副本处于打开状态。只要您有一个现有副本正在运行,gedit
从终端启动调用然后关闭终端就不会杀死 gedit。
对于其他事情,其他人说的也行得通。我是nohup
...的粉丝,但如果您需要一个可以拆卸然后重新连接的终端,您需要查看screen
。
- 在终端中运行它,然后运行一些不断推送输出的东西。我使用 Django 开发服务器,但
irssi
甚至watch uptime
可以作为很好的例子。 - 关闭该终端并启动一个新终端。
- 跑起来
screen -r
然后“轰”的一声,你就回来了。
screen
比这大得多,你可以将它与 结合起来byobu
以获得更好的终端体验。阅读全文。