#1 楼
您应该寻找诸如tmux
之类的现代替代产品。由于许多原因,tmux
优于screen
,这里仅列举一些示例:Windows可以在会话之间移动甚至可以链接到多个会话
Windows可以在水平和垂直方向上划分为窗格
支持UTF-8和256色终端
可以从外壳控制会话,而无需输入会话
基本功能
要获得与推荐
screen
的答案相同的功能,您需要执行以下操作:ssh进入远程计算机
通过在外壳中键入
tmux
来启动tmux
在启动的
tmux
会话中启动所需的进程通过按Ctrl + b然后按d来退出/分离
tmux
会话现在,您可以安全地从远程计算机注销,您的进程将在
tmux
内继续运行。当您再次回来并要检查进程的状态时,可以使用tmux attach
附加到tmux
会话。如果要让多个会话并排运行,则应命名每个会话使用Ctrl + b和
$
。您可以使用tmux list-sessions
获取当前正在运行的会话的列表,现在可以使用命令tmux attach-session -t <session-name>
附加到正在运行的会话。tmux
可以比在单个会话中处理单个窗口做更多的高级操作。有关更多信息,请访问man tmux
或tmux GitHub页面。特别是,这是有关screen
和tmux
之间的主要区别的常见问题解答。评论
@CraigM如果仅激活一个屏幕会话,请使用screen -x -r [screenname]或screen -rx的简称。这使您可以附加现有的屏幕实例。
– Lekensteyn
2012年11月25日上午10:31
这个建议帮助我解决了同样的问题,但是我认为它包含一个错字。我很确定您需要先按Ctrl-b,然后再按d,以离开/分离tmux会话。当然,我的Ubuntu 12.04上的tmux版本就是这种情况。
–cxrodgers
2012年12月25日上午8:31
按照上述说明操作时我犯了一个错误。如果有人可能会犯同样的错误,我将分享它:我在自己计算机的外壳而不是远程计算机的外壳中启动了tmux。需要在远程计算机的外壳中启动tmux。
–努霍格卢医生
2014年8月22日14:53
现在正在重新开发屏幕:lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html您能否更新答案?
–muru
2014年11月3日,下午3:27
或者,运行tmux detach而不是键入ctrl-b d
–安德鲁(Andrew)
2015年11月3日在22:51
#2 楼
选项1:nohup
最好的方法通常是最简单的。
nohup long-running-command &
专门为此设计,它甚至将标准输出记录到
nohup.log
。 />选项2:bg
+ disown
ctrl+z
bg
disown -h
如果要“后台”已经在运行的任务,则Ctrl + Z然后运行
bg
将最新的挂起任务置于后台,使其继续运行。注销后,disown
将保持进程运行。 -h
标志可防止挂断。screen
和其他人可以做到这一点,但这不是他们的目的。对于您知道将要离开的任务,我建议使用nohup
,对于已经运行但又不想重新启动的任务,我建议使用bg
。请记住,两者都是针对bash的。如果您不使用bash,则命令可能会有所不同。
评论
我建议放弃-h
–米歇尔
17年8月21日在16:45
有趣的是,屏幕和tmux对矿工不起作用,bur nohup起作用
– YasinOkumuş
17年11月1日在19:04
bg + disown不适用于我。我有一个正在运行的部署脚本,忘了在tmux内部启动,需要提前离开开会。脚本连续将进度输出到外壳。 ctrl + z停止了该过程,使我回到bash。 bg恢复了该过程,但也恢复了将状态输出到bash的功能,因此无法看到我在输入什么。但是,一个disown命令产生了“ disown:current:无此工作”
– BrianHVB
18/09/11在23:42
无论出于何种原因,这对于julia myFile.jl都不适合我。 tmux确实而且很棒。
– Kilgoretrout
18-10-25在5:11
为了澄清起见,选项2是bg +不存在。仅靠bg是不够的。如果注销ssh,bg或&可能会起作用(因为默认的shopt huponexit = off),但是如果您的ssh连接断开,除非您取消连接,否则它不会起作用
– Wisbucky
4月28日下午5:55
#3 楼
您可以使用screen
来做到这一点。键入
man screen
可以了解更多信息或阅读此屏幕手册页。简单情况:
放入您的遥控器盒中。键入
screen
,然后启动所需的过程。按Ctrl-A,然后按Ctrl-D。这将“分离”您的屏幕会话,但使您的进程保持运行状态。现在,您可以从远程框中注销。
如果要稍后返回,请再次登录并键入
screen -r
。这将“恢复”您的屏幕会话,并且您可以看到过程的输出。评论
通常,我将使用screen -S名称来命名我的屏幕会话,以使以后更容易连接到正确的屏幕会话。
–大卫·奥尼尔(David Oneill)
2012年11月24日22:37
链接已断开
–Gab是好人
16-09-16在13:50
就个人而言,我正在使用没有任何包装控制软件的盒子。从源头上花了大约半小时为TMUX(我个人有过类似经验)建立依赖关系之后,很明显,屏幕对我来说是更好,更简单的解决方案。 TL; DR:针对此问题的最佳解决方案取决于用例,机器以及必须设置的时间。感谢您的回答:)
–马克斯·冯·希佩尔
17年11月1日,3:30
离开前与屏幕-S组合,回来时与屏幕-r组合非常好!
–梅洛曼
18-3-14在10:03
当您以后想恢复屏幕时,使用screen -list列出所有活动屏幕也很有帮助。您可以使用屏幕-r XXXXX恢复ID为XXXXX的屏幕。
–戴尔·库伯(Dale Kube)
19年1月4日在21:16
#4 楼
屏幕和nohup是更好的方法,但是如果必须分离一个已经在没有屏幕或nohup的情况下运行的进程,则可以运行disown命令。disown [-ar] [-h] [
jobspec
… |
pid
… ]
没有选项,请删除每个来自活动作业表的jobspec。如果指定了
-h
选项,则不会从表中删除该作业,而是对其进行标记,以便在外壳程序收到SIGHUP时不将SIGHUP发送到该作业。如果不存在jobspec,并且没有提供-a
和-r
选项,则使用当前作业。如果未提供jobspec,则-a
选项意味着删除或标记所有作业;不带jobspec参数的-r
选项将操作限制为正在运行的作业。使用disown,您可以关闭终端并在计算机上运行进程。
评论
这也是我最喜欢的方法。我经常使用disown -a && exit
– Stefano Palazzo
2010-10-21 17:45
完善。这是一个可爱的命令,值得所有赞扬!
–格雷格
2014年4月29日上午10:38
一个警告,我用Ctrl-Z停止了一个正在运行的进程,并且在调用disown之前没有在后台启动它并将其杀死。
– HDave
2014年9月23日下午21:07
如果要写入终端,可能会崩溃。重定向正在运行的进程的输出并不那么容易。最好使用nohup正确启动它。
– Jiggunjer
16年8月25日在12:42
这是一个很好的答案,因为它直接回答了问题。问题的作者询问了已经执行了许多长时间运行的命令后该怎么做。这些答案大多数使您知道在执行命令之前要做什么。
–q0rban
17年8月17日在0:24
#5 楼
我被困在一个大型MV中,因此无法停止该过程,设置屏幕并重新启动。通过基本执行以下步骤,我设法退出了ssh会话并运行了进程:Ctrl + Z
bg
disown [进程pid可选,默认为最后]
退出
步骤3暂停当前进程(例如,我的“ mv”命令) 。
第4步将暂停的进程放到后台并继续执行。
第5步让您放弃该进程。**要获取作业列表,只需在前面键入
jobs
。 **关于下架(来自bash手册):
disown [-ar] [-h] [jobspec ... | pid ... ]
Without options, remove each jobspec from the table of active
jobs. If jobspec is not present, and neither the -a nor the -r
option is supplied, the current job is used. If the -h option
is given, each jobspec is not removed from the table, but is
marked so that SIGHUP is not sent to the job if the shell
receives a SIGHUP. If no jobspec is supplied, the -a option
means to remove or mark all jobs; the -r option without a job‐
spec argument restricts operation to running jobs. The return
value is 0 unless a jobspec does not specify a valid job.
评论
内置始终是我的首选:) THX
– ken_oy
18年4月2日在13:30
该答案应标记为正确。安装并习惯于使用屏幕来解决此问题被夸大了。
–乌尔里希·洛伦茨·施吕特(Ulrich-LorenzSchlüter)
18年4月5日在11:41
当您已经启动任何命令并且运行了很长时间时,这将非常有用。在TMUX会话中终止和启动它需要时间
– Deepali Mittal
18年5月14日在10:54
@ tom-brossman:请当心像这样的不必要的编辑!如果在没有作业说明的情况下调用,disown内置命令将作用于最新的后台作业。
–大卫·福斯特(David Foerster)
18-10-29在16:13
#6 楼
您可以使用两个主要程序来维护多个ssh连接上的程序和终端状态。它们是屏幕(现有的,但不幸的是未维护。显然现在正在积极开发)和tmux(较新的,正在积极维护)。 Byobu是可以在这些系统之上运行的前端,并提供其他ubuntu状态信息。在新安装的设备上,它将使用tmux作为后端,如果您安装的是byobu较旧的版本,并且现有的配置将保留先前的后端(无论是屏幕还是tmux)。Byobu
Byobu可以安装在通过在基于Debian的计算机上执行以下操作来操作计算机:
使用yum,您可以这样做
sudo aptitude install byobu
也可以在其他发行版中安装byobu。
使用byobu
使用ssh连接后,您可以通过在主机上运行
byobu
来启动byobu。这将为您提供一个如下所示的外壳:
您也可以使用Byobu在具有-X选项的Ubuntu机器上运行终端,并轻松实现完美的byobu。
用法:
通过键入
byobu
来启动byobu。您可以按F2键在当前会话中创建一个新窗口,F3-F4可以在各个窗口之间进行切换。
关于byobu的最好的部分是,您不必杀死终端中正在运行的进程即可离开终端。您只需将屏幕/ tmux(byobu的骨架)发送到背景,然后在下次出现时恢复:
要离开byobu并保持其运行(分离),请按F6。
下次再来时,只需执行
byobu
,您就可以回到原来的位置。您也可以创建
byobu -S session1
等各种byobu会话,等等。而且您回来时可以连接到其中任何一个。您可以使用Byobu做更多的事情。使用它!
这里有一些权威指南。
评论
我尝试从基于PuTTY的会话到我的Ubuntu盒子使用byobu,但是我重复了状态行并在显示屏上滚动。尽管在按F6键时它已正确分离,但在我的设置中不是可用的解决方案。
– jfmessier
2013年11月6日17:47
@jfmessier这是因为PuTTY不能很好地使用ncurses(基本上是utf-8)。可以通过关注此线程来消除此问题-stackoverflow.com/questions/10731099/…
–SiddharthaRT
13年7月7日在10:40
这太棒了! 1.它给了我一个彩色的bash提示,我似乎无法将bash作为默认外壳启用; 2.我可以同时运行2个bot,但仍然需要另一个终端来工作! @SiddharthaRT先生,您值得推荐!
–开发
16年7月22日在6:53
#7 楼
一旦过程开始,您将无法执行此操作,您需要先进行设置,然后才能运行长期运行的工作。您可以使用nohup,但是现代智慧建议您使用screen或byobu作为登录名,您可以分离并保持运行状态。
屏幕的优点是您可以从一台机器上拆下然后再从另一台机器上重新安装,如果您要检查工作日结束后运行的长时间运行的流程,这将非常方便。 br />这里有一个合理的屏幕入门指南。
byobu在菜单顶部的屏幕顶部提供了易于使用的界面。这也是较新的ubuntu屏幕的当前实现。 F2启动新端子F3 / F4来回切换,F6断开连接。键入exit以永久终止终端。
评论
这些天byobu使用tmux。
–斯科特
2012年11月28日在7:04
“一旦流程开始,您将无法执行此操作,您需要先进行设置,然后再运行长期运行的作业。” -不,您可以使用disown实现此目的。见@bassgey的答案
–丰富
13年5月23日在16:11
在努力学习屏幕和tmux之后。...byobu使我的眼泪
– HDave
2014年9月23日下午21:06
放弃,如果需要的话,只需按Ctrl-z,然后使用bg将其移至活动终端并移至后台。然后,放弃。
– mimoralea
17年11月21日在20:49
#8 楼
对于我已经运行了很长时间的单个shell脚本,我将登录并使用'&'在后台运行该过程。示例:
/path/to/my/script &
我已经注销并断开了SSH会话。稍后我登录时,脚本仍在执行,这是通过从脚本连续收集数据来证明的。
评论
是的,我想知道screen / tmux比这个简单的解决方案更好。
– Mads Skjern
15年3月16日在8:51
是的,我也可以在我的ubuntu上看到它,但是从理论上讲应该不会发生。我不明白为什么
–丹尼尔·平诺(Daniel Pinyol)
16年4月22日在13:08
@MadsSkjern因为您不能使用此方法在脚本中输入任何输入。
–肯·夏普
17年2月10日在22:18
@MadsSkjern的原因是,如果您使用&运行类似的进程,并且注销并登录到SSH会话,则该进程仍将运行,但是您将无法看到该进程的输出(如果脚本回显了某些内容,不会看到它,但是如果它写入文件,则文件将存在)
– DarkCygnus
17年8月24日在16:20
如何在输出文件的同时保持运行状态?我应该在&之前还是之后加上>吗?
–奥古斯丁·牛顿
3月24日,3:13
#9 楼
嘿,虽然我同意屏幕是最有效的选择。您可以使用vncserver然后在其上启动该进程。
此外,如果您唯一的兴趣是使该进程运行并且没有需要重新控制它,而最重要的是,您根本不知道需要关闭会话并且已经运行了该进程,如果您使用bash作为shell,您将不走运
首先,您需要通过键入Ctrl + Z,然后输入bg%1(该数字取决于作业号,通常为1,但是您可以使用命令jobs轻松拉出列表),将进程发送至后台。
最后调用disown命令(后跟Jobid ...与bg命令相同)
这将删除您的Shell与后台进程之间的父子关系,从而防止它在外壳终止时死亡。
评论
这个答案是最好的!为什么现在每个人都在谈论屏幕,问题是登录后引发的问题,如何保持进程运行(现在登录后但启动之前)。很好的答案豪尔赫,您真的帮助了我! :)
– jwbensley
2012年8月10日17:13
通常bg(不带%1)就足够了,因为默认值为当前作业
–沃尔特·特罗斯(Walter Tross)
2012年11月23日在21:55
最好有一个全面的答案:先验(预先设置):ascii终端屏幕(旧),tmux(针); X视窗:vnc(旧的,仍保留),xpra(较新),而xpra是无根的。后验(开始后仍然存在):^ Z,不显示,……但我懒得将其充实。
– Krazy Glew
18年7月12日在23:02
#10 楼
您应该查看GNU屏幕,看看它是否对您有帮助。根据您需要实时运行应用程序的方式,它可能会导致问题超出解决的范围,但是至少它可以让您像从未离开过会议一样继续进行会话。如何使用:
首先使用命令
screen
,滚动浏览介绍消息,您将获得一个终端。Ca Cc打开另一个终端
Ca Ck杀死终端
您可以使用Ca C-Space和Ca C-Backspace在终端之间循环操作
如果您仅使用两个终端,则Ca Ca很方便
Ca Cd会分离当前屏幕会话并退出屏幕。然后,您可以使用
screen -r
恢复该会话。您可以一次拥有几个分离的屏幕会话,在这种情况下,您将看到可用会话的列表。还有许多其他选项,例如分屏,并且所有快捷方式都可以完全自定义。
#11 楼
最简单的答案...ctrl + z将挂起正在运行的程序
“ bg”将在后台运行它
评论
如果不放弃进程(使用诸如disown或nohup之类的东西),通常在SSH会话结束后将无法保持进程运行。
– Eliah Kagan
13年8月13日在0:32
在我的Ubuntu服务器上,使用默认设置,它确实可以继续运行!
– Mads Skjern
15年3月16日在8:53
#12 楼
最简单的方法是使用&
在后台运行命令。然后只需写:disown -a
#13 楼
尽管每个人都说要使用disown
(已经开始执行此过程后唯一的选择),nohup
或什至在screen
中运行命令,如果要查看命令的所有输出,这很有用...我我仍然尝试过Linux的最新主流发行版,只是将工作置于后台并退出并不会导致所有正在运行的进程死亡。必须存在全局设置或其他内容。我正在一些较旧的系统(松弛软件12)上尝试此操作,并且测试脚本一直运行,直到我手动将其杀死:shell$ cat > test.pl
#!/usr/bin/perl
while(1){
sleep(1);
}
shell$ perl ./test.pl &
shell$ exit
logout
shell$ ps aux test.pl
mymom 31337 1 0 13:25 ? 00:00:00 perl ./test.pl
shell$
虽然我同意
screen
将最好的方法来运行它,即使我的脚本写了日志文件或其他内容也是如此。除非它完全脱离了妄想症,否则我从来不需要使用screen
或disown -a
。也许有人可以阐明默认情况下bash的行为方式?也许某些系统管理员更改了大型Shell的默认设置,以防止其用户的进程使系统超载? 评论
如果您有任何其他疑问,请作为一个新问题提出
–heemayl
15年7月30日在2:05
#14 楼
而不是:cmd options;
在
nohup
之前添加:nohup cmd options &
然后,您将可以看到控制台标准输出者:
tail -f nohup.out
评论
相关:unix.stackexchange.com/questions/4004/…