Answers:
为了运行长时间的进程,如果需要更友好的界面,可以使用screen或byobu。
对于屏幕,可以使用:
screen [program] [args]
这将在屏幕会话内运行[程序]及其[args] 。程序完成后,会话将自动关闭。如果您希望在程序运行后保留会话,只需在运行屏幕上不带任何参数,会话中就会出现新的提示。CTRL + A + D将终端与当前会话分离。
要重新连接到上一个会话:
screen -r
如果仅打开一个会话,它将立即重新连接。如果正在进行多个会话,它将询问您要附加到哪个会话。如果您知道会话名称,则可以将其作为参数添加到此命令行中。
Byobu是一个不错的改进。它基于屏幕,但在底部提供一个栏,将所有当前会话显示为选项卡,并提供了更方便的快捷方式来移动这些会话。您可以:
忠告:避免让用户root开启会话。如果任何人(本地或远程)都可以访问您的终端,则他们可以轻松地重新连接到正在进行的会话,并将您的系统用作root用户。如果需要,最好在必要时使用普通用户和sudo个性化命令行启动会话。
虽然您无法重新连接到断开的SSH会话,但是您可以重新运行SSH内部运行的进程 -功能上与您想要的相同。
在您的情况下,您将接管apt-get
要由新的 SSH会话,screen
会话等控制的过程。我最喜欢的reptyr
命令是:
$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8 R+ 0:32 apt-get upgrade
然后,使用为过程找到的pid:
$ sudo reptyr -T 10626
或者,如果这不起作用,请尝试:
$ reptyr 10626
在此阶段之后,您所有的键盘输入都将进入您接管的程序。不幸的是,您不会看到SSH会话的旧输出,例如apt-get
要求您进行确认的输出。
还有多种其他工具,它们的工作原理基本相同reptyr
(即通过ptrace
调试附件)。请参阅以下问题和答案进行讨论:
在上面的说明中,在命令使用TTY窃取的同时reptyr 10626
使用ptrace
debug附件,这sudo reptyr -T 10626
是更可取的(详细信息)。
最后,您不能通过这种方式接管SSH会话的原因是,sshd
进程不受主机终端的控制,而是提供了终端的从属部分(即pts
设备),而控制它的主控部分则位于主机上。客户端计算机,在此之间有一个中断的SSH会话。当您用强制接管这样的sshd
过程时reptyr -s <pid>
,键盘输入将进入该过程,而不是其活动的子过程。因此,“ Ctrl + Z”将简单地杀死它sshd
。
apt-get
过程仍在运行。它应该与整个过程链一起消失,直到SSH。我注意到它会do-dist-upgrade
自动在screen
/byobu
会话中启动:也许在某些情况下,apt-get
是否一样?