问题描述
一些GUI应用程序通过终端命令行干净地启动。
有些不这样做,并且导致终端等待应用程序终止。 …即使如此,有些不要”release”的命令行。
神秘的&符号”&”后缀,似乎会导致终端将进程置于后台…(但我不确定那里会发生什么)。
有没有办法通过终端启动应用程序,以便没有”hang on”效果? …就像通过F2启动某些东西一样。
我希望立即再次提供命令行(没有任何东西在后台,并在终端中写出系统消息)。
最佳解决办法
在gedit的情况下,我只是一直打开一个副本。只要你有一个现有的副本运行,从终端启动gedit
调用,然后关闭终端不会杀死gedit。
对于其他事情,其他人所说的也会起作用。我是nohup
的忠实粉丝……但是如果你需要一个终端,你可以分离,但是然后re-attach到,你想看看screen
。
-
在终端中运行它,然后运行一些可以保持输出的东西。我使用Django开发服务器,但
irssi
甚至watch uptime
都是很好的例子。 -
杀死终端并开始新的终端。
-
运行
screen -r
和BOOM,你回来了。
screen
比这更大,您可以将它与byobu
结合使用,以获得更好的终端体验。阅读周围。
次佳解决办法
假设gedit
是要运行分离的程序(又名”disown”,”disentangle”,”decouple”)。根据你想要做什么,有不同的方法:
程序已经运行
断绝关系:
disown -h
是如果你想用已经运行的程序来做到这一点(即如果你忘了nohup
它)。您首先必须使用Ctrl
+ Z
停止它。然后,您可以使用bg [jobId]
(例如bg 1
)放入支架。您可以使用jobs
获取正在运行的作业的列表。之后,您可以使用disown -h %[jobId]
将其与终端分离。示例终端会话:
confus@confusion:~$ gedit
^Z
[1]+ Stopped gedit
confus@confusion:~$ jobs
[1]+ Stopped gedit
confus@confusion:~$ bg 1
[1]+ gedit &
confus@confusion:~$ disown -h %1
confus@confusion:~$ exit
程序尚未启动
nohup
nohup
并不总是出现在所有机器上。如果你知道你想事先解耦,你可以使用:
nohup gedit &
也许你会想重定向shell输出,你的程序也是一个伪输入源,所以:nohup ./myprogram > foo.out 2> bar.err < /dev/null &
。你会希望将输出重定向到不被它烦恼或稍后使用它。 null-input可以帮助防止ssh中的混乱。
子shell:
你可以通过获得类似的效果
confus@confusion:~$ (geany 2>&1 /dev/null &)
方括号打开一个新的子shell来运行gedit。2>&1 /dev/null
将shell输出重定向到无处(抑制输出)。最后&
将该过程置于后台。
终端复用
也使用screen或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屏幕的退出键 – Alt-Pageup
在此窗口的历史记录中向后滚动 – Alt-Pagedown
向前滚动此窗口的历史记录 – Ctrl-a-!
打开或关闭所有Byobu的按键绑定 –
‘at’ deamon等
at
是在预定时间运行命令的一个很好用的小工具。它可以是’misused’从shell分离一个命令:
echo './myprogram myoption1 myoption2' | at now
你也可以看看setsid
和start-stop-daemon
,但其他方法应该足够了。
第三种解决办法
The mysterious ampersand “&” suffix, seems to cause the terminal to put the process into the background… (but I’m not sure what happens there).
它确实,而且往往是你想要的。如果您忘记使用&;您可以使用ctrl-z暂停程序,然后使用bg命令将其置于后台 – 并继续使用该shell。
进程的stdin,stdout和stderr仍然连接到终端;您可以根据需要将/从/dev /null或其他任何文件(例如,保存输出日志)重定向到/dev /null。
some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1
您可以在作业中看到进程,将其带回前台(fg命令),并发送信号(kill命令)。
一些图形程序将从终端分离;如果是这样的话,当你运行命令”normally”时,你会注意到它启动了图形程序和”exits”。
这里是a short script,你可以把它放在我命名为runbg的~/bin中:
#!/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’s answer。
第四种办法
使用nohup
nohup is a program that runs a given command with hangup signals ignored, so that the command can continue running in the background after its parent process terminates. See the manpage
例如:
nohup gedit something
第五种办法
要启动应用程序并将其从启动的终端中分离出来,请使用&!。
firefox &!
第六种办法
打开终端,键入屏幕,输入要运行的命令,关闭终端。该程序应该继续在GNU屏幕会话中运行。