有时我想开始一个过程而忘记它。如果我从命令行启动它,像这样:
redshift
我无法关闭终端,否则它将终止该过程。我可以以不中断进程就可以关闭终端的方式运行命令吗?
yourExecutable &
并且输出不断出现在屏幕上,并且Ctrl+C
似乎没有停止任何操作,即使屏幕正在滚动显示输出,您也只能盲目地键入disown;
并按一下Enter
,而您看不到什么您正在输入。该过程将被取消,您将可以关闭终端而该过程不会终止。
有时我想开始一个过程而忘记它。如果我从命令行启动它,像这样:
redshift
我无法关闭终端,否则它将终止该过程。我可以以不中断进程就可以关闭终端的方式运行命令吗?
yourExecutable &
并且输出不断出现在屏幕上,并且Ctrl+C
似乎没有停止任何操作,即使屏幕正在滚动显示输出,您也只能盲目地键入disown;
并按一下Enter
,而您看不到什么您正在输入。该过程将被取消,您将可以关闭终端而该过程不会终止。
Answers:
以下2项之一应该起作用:
$ nohup redshift &
要么
$ redshift &
$ disown
有关其工作原理的更多信息,请参见以下内容:
man nohup
help disown
nohup,disown和&之间的区别(请务必也阅读注释)
redshift & disown
)在Ubuntu 10.10上为我工作。将其全部放在一行上似乎工作正常。有什么理由我不应该这样做吗?
nohup redshift &
这样做也有背景)。将第二行放在一行上很好,尽管通常您用;
(redshift &; disown
)分隔
;
和和&
都是命令分隔符,并且具有相同的优先级。唯一的区别是分别是同步执行还是异步执行。不需要&;
优先使用&
而已(它可以工作,但是有点多余)。
如果您的程序已经在运行,则可以使用暂停它Ctrl-Z
,然后使用将其拖入背景,bg
然后将其拉入后台disown
,如下所示:
$ sleep 1000
^Z
[1]+ Stopped sleep 1000
$ bg
$ disown
$ exit
disown
不会断开stdout或stderr的连接。但是nohup
,>/dev/null
(断开标准输出),2>/dev/null
(断开标准错误)也是如此。它(disown
)断开作业控制。
@StevenD已经发布了很好的答案,但是我认为这可能会进一步澄清它。
该进程在终端终止时被终止的原因是,您启动的进程是该终端的子进程。一旦关闭终端,这也会杀死这些子进程。您可以使用来查看进程树pstree
,例如kate &
在Konsole中运行时:
init-+
├─konsole─┬─bash─┬─kate───2*[{kate}]
│ │ └─pstree
│ └─2*[{konsole}]
要使kate
进程与konsole
终止时分离,请与命令一起konsole
使用nohup
,如下所示:
nohup kate &
关闭后konsole
,pstree
将如下所示:
init-+
|-kate---2*[{kate}]
而kate
将生存。:)
一个替代方案是使用screen
/ tmux
/ byobu
,其将保持壳运行,独立于终端的。
您可以在终端中运行这样的过程
setsid process
这将在新会话中运行程序。如http://hanoo.org/index.php?article=run-program-in-new-session-linux中所述
nohup.out
。2)它不会保留在Shell的作业列表中,因此不会使输出混乱jobs
。
尽管所有建议都可以正常工作,但我发现我的替代方法是使用screen
,该程序可在屏幕上设置虚拟终端。
您可以考虑以开头。屏幕几乎可以安装在所有Linux和Unix派生产品上。点击+ 和(小写)将开始第二个会话。这将允许你通过点击来来回切换初始会话之间+ 和或较新的会话击中+ 和。一个终端最多可以有十个会话。我曾经在工作中开始一个会话,回家,在我的工作机中使用ssh,然后调用。这将使您重新连接到该远程会话。screen -S session_name
CtrlACCtrlA0CtrlA1screen -d -R session_name
screen -d -m command
:已分离屏幕内将开始它 ~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x
....你的是,
仅通过shell即可完成所有操作的方法是关闭stdin并后台执行命令:
command <&- &
这样,当您退出外壳程序时,它就不会退出。重定向标准输出是一个很好的可选操作。
缺点是事实之后您不能执行此操作。
我有一个脚本可以:
我用它主要为gedit
,evince
,inkscape
等所有有很多烦人的终端输出的。如果命令之前完成TIMEOUT
,则返回nohup的退出状态,而不是零。
#!/bin/bash
TIMEOUT=0.1
#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
nohup "${@}" >/dev/null 2>&1 &
NOHUP_PID=$!
#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally
#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error ${@}"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS
例子...
>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail
我更喜欢:
(应用名称 &)
例如:
linux@linux-desktop:~$ (chromium-browser &)
键入命令时,请确保使用括号!
nohup
防止任何tty输出,而我实际上只想将输出重定向到文件,并且这样做可以防止,所以这对我来说是更好的解决方案。
可以说与apolinsky提供的答案类似,我在上使用了一个变体screen
。香草命令是这样的
screen bash -c 'long_running_command_here; echo; read -p "ALL DONE:"'
Ctrl ACtrl D在简单的情况下,可以使用断开会话的连接并重新连接screen -r
。我有这个裹在一个叫做脚本session
的是住在我PATH
准备方便:
#!/bin/bash
#
if screen -ls | awk '$1 ~ /^[1-9][0-9]*\.'"$1"'/' >/dev/null
then
echo "WARNING: session is already running (reattach with 'screen -r $1')" >&2
else
exec screen -S "$1" bash -c "$@; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1
仅当您事先知道要断开程序时,此方法才有效。它不提供要断开已运行的程序的功能。