有些 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 输出重定向到任何地方(抑制输出)。而&在结束并将其进程在后台运行。
也可以使用screen或byobu 进行终端多路复用。您基本上可以在自己的终端中运行该程序。出于其他原因,我真的可以推荐 byobu。以下是可能在您的第一步中派上用场的boybu-shortcuts 列表:
有用:
不太有用:
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)
小智 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。
Flo*_*sch 20
用 nohup
nohup 是一个程序,它运行给定的命令而忽略挂断信号,以便该命令可以在其父进程终止后继续在后台运行。请参阅联机帮助页
例如:
nohup gedit something
Run Code Online (Sandbox Code Playgroud)
Oli*_*Oli 17
在 gedit 的情况下,我只是一直打开一个副本。只要您有一个现有的副本在运行,gedit从终端启动调用然后关闭终端就不会杀死 gedit。
对于其他事情,其他人所说的也适用。我是nohup......的粉丝,但是如果你需要一个终端,你可以分离然后重新连接到,你想看看screen.
irssi甚至watch uptime是很好的例子。screen -r,轰隆隆,你又回来了。screen比这大得多,您可以将其与byobu更好的终端体验结合起来。阅读。