假设我从ssh会话启动了一堆进程。是否可以在使那些进程在远程计算机上运行的同时终止ssh会话?
假设我从ssh会话启动了一堆进程。是否可以在使那些进程在远程计算机上运行的同时终止ssh会话?
Answers:
您应该寻找像这样的现代替代品tmux
。
tmux
screen
由于许多原因而优于,这只是一些示例:
要获得与答案推荐中所述相同的功能screen
,您需要执行以下操作:
tmux
输入tmux
外壳tmux
会话中开始您想要的过程tmux
通过输入Ctrl+ 离开/分离会话b,然后d 现在,您可以安全地从远程计算机注销,您的进程将继续在内部运行tmux
。当您再次回来并想要检查流程状态时,可以使用它tmux attach
来附加到tmux
会话。
如果要让多个会话并排运行,则应使用Ctrl+ b和来命名每个会话$
。您可以使用来获取当前正在运行的会话的列表tmux list-sessions
,现在可以使用command附加到正在运行的会话tmux attach-session -t 0
。
tmux
与在单个会话中处理单个窗口相比,可以执行更多高级的操作。欲了解更多信息,有一看man tmux
还是在TMUX页面GitHub的。特别是,这是有关screen
和之间主要区别的常见问题解答tmux
。
screen -x -r [screenname]
或screen -rx
简称,如果您仅激活一个屏幕会话。这使您可以附加现有的屏幕实例。
Ctrl-b
然后d
离开/分离tmux
会话。当然,tmux
我的Ubuntu 12.04上的版本就是这种情况。
tmux detach
而不是打字ctrl-b d
nohup
最好的方法通常是最简单的。
nohup long-running-command &
它是专门为此设计的,甚至将stdout记录到nohup.log
。
man nohup
bg
如果您想“后台”一些已经运行的任务,那么最好的选择是Ctrl+ Z然后运行
bg
将您最近暂停的任务置于后台,使其继续运行。
然后,快速disown
退出后即可保持该过程运行。
screen
其他人可以做到,但这不是他们的目的。nohup
对于那些您将要离开bg
的任务,以及那些已经在运行并且不想重新启动的任务,我建议您这样做。
请记住,两者都是针对bash的。如果您不使用bash,则命令可能会有所不同。
disown -h
bg
+ disown
对我不起作用。我有一个正在运行的部署脚本,我忘了在tmux内部开始,需要提前离开开会。脚本连续将进度输出到外壳。ctrl+z
停止了该过程,使我重返bash。bg
恢复了该过程,但也恢复了将状态输出为bash的状态,从而无法看到我在输入什么。然而,一条disown
命令产生了“不存在:当前:没有这样的工作”
julia myFile.jl
无论出于什么原因,这都不适合我。tmux确实而且很棒。
您可以使用来做到这一点screen
。
键入man screen
以查找更多信息或阅读此屏幕手册页。
简单方案:
ssh到您的远程框中。键入screen
然后启动所需的过程。
按Ctrl- A然后Ctrl- D。这将“分离”您的屏幕会话,但使您的进程保持运行状态。您现在可以注销远程框。
如果您想稍后再回来,请再次登录并键入“ screen -r
这将“恢复”您的屏幕会话,您可以看到该过程的输出。
screen -S name
,以便以后更轻松地连接到正确的屏幕会话。
screen -S
假前和screen -r
回来时是惊人的!
屏幕和nohup是更好的方法,但是如果必须分离一个已经在没有屏幕或nohup的情况下运行的进程,则可以运行disown命令。
disown [-ar] [-h] [
jobspec
… |
pid
… ]
如果没有选项,请从活动作业表中删除每个作业规范。如果指定了该
-h
选项,则不会从表中删除作业,而是对其进行标记,以便如果Shell收到SIGHUP,则不会将SIGHUP发送到该作业。如果不存在jobspec,并且没有提供no-a
或-r
选项,则使用当前作业。如果未提供jobspec,则该-a
选项意味着删除或标记所有作业;-r
没有jobspec参数的选项将操作限制为正在运行的作业。
使用disown,您可以关闭终端并在计算机上运行该进程。
disown -a && exit
disown
并杀死了它。
我被困在一个大型MV中,因此无法停止该过程,设置屏幕并重新启动。通过基本上执行以下步骤,我设法退出了ssh会话并运行了进程:
步骤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.
您可以使用两个主要程序来维护多个ssh连接上的程序和终端状态。它们是屏幕(现有的,但不幸的是未维护。显然现在正在积极开发)和tmux(较新的,正在积极维护)。Byobu是可以在这些系统之上运行的前端,并提供其他ubuntu状态信息。在新安装的设备上,它将使用tmux作为后端,如果您安装的是byobu较旧的设备,并且具有现有配置,它将保留先前的后端,无论是屏幕还是tmux。
可以在基于Debian的计算机上将Byobu安装在计算机上:
sudo aptitude install byobu
使用yum,您可以
su -c 'yum install byobu'
也可以在其他发行版上安装byobu。
byobu
使用ssh连接后,可以通过在主机上运行来启动byobu 。这将为您提供一个如下所示的外壳:
您还可以在具有-X选项的Ubuntu机器上使用Byobu Terminal,并轻松拥有完美运行的byobu。
通过键入开始byobu byobu
。
您可以按F2在当前会话中创建一个新窗口,按F3-F4在各个窗口之间切换。
关于byobu最好的部分是,您不必杀死终端中正在运行的进程即可离开终端。您只需将屏幕/ tmux(byobu的骨架)发送到背景,然后在下次访问时恢复:
下次您来的时候,就去做byobu
,您应该回到原来的位置。
您还可以创建各种byobu会话byobu -S session1
,依此类推。当您回来时,您可以连接到它们中的任何一个。
一旦流程开始,您将无法执行此操作,您需要先进行设置,然后再运行长期运行的作业。
您可以使用nohup,但是现代的智慧建议您使用screen或byobu作为登录名,以便分离并保持运行。
Screen的优点是您可以从一台机器上拆下然后再从另一台机器上重新安装,如果您要检查工作日结束后运行的长时间运行的流程,这将非常方便。
byobu通过菜单等在屏幕顶部提供了易于使用的界面。这也是新版ubuntu上屏幕的当前实现。F2启动新端子F3 / F4来回切换,F6断开连接。键入exit以永久终止终端。
disown
用来实现这一目标。见@ bassgey的答案
disown
如果只需要Ctrl-z
,则bg
可以将其移至活动终端并移至后台。然后,disown
。
嘿,虽然我同意萤幕是最有效的选择。您可以使用vncserver,然后在其上启动该过程。
同样,如果您唯一的兴趣是使进程运行并且不需要控制,并且最重要的是您不知道需要关闭会话并且已经运行了该进程,那么如果你用bash作为外壳
首先,您需要通过键入Ctrl + Z和bg%1(将数字发送到后台将进程发送到后台)(该数字取决于作业号,通常为1,但是您可以使用命令jobs轻松拉出列表)
最后调用disown命令(后跟Jobid ...与bg命令相同)
这将删除您的外壳程序与后台进程之间的父子关系,从而防止它在外壳程序终止时消失。
screen
,问题是登录后引发的事件,即如何在登录后但启动之前使进程保持运行。很好的答案豪尔赫,您真的帮助了我!:)
bg
(没有%1
)通常就足够了,因为默认值是当前工作
对于我已经运行了很长时间的单个shell脚本,我将登录并使用'&'在后台运行该过程。
例:
/path/to/my/script &
我已经注销并断开了SSH会话。稍后我登录时,脚本仍在执行,这是通过从脚本连续收集数据来证明的。
&
注销并登录到SSH会话后运行这样的进程,则该进程仍将运行,但是您将无法看到该进程的输出(如果脚本回显了某些内容,将看不到它,但是如果它写入文件,文件将在那里)
您应该查看GNU屏幕,看看它是否对您有帮助。根据您需要应用程序实时运行的方式,它可能会导致问题超出解决的范围,但是至少它可以使您像从未离开过会议一样恢复会话。
如何使用 :
screen
进行首次启动,滚动浏览介绍消息,您将获得一个终端。screen -r
用来恢复该会话。您可以一次拥有多个分离的屏幕会话,在这种情况下,将显示可用会话的列表。还有许多其他选项,例如拆分屏幕,并且所有快捷方式都可以完全自定义。
最简单的答案...
ctrl + z将暂停正在运行的程序
“ bg”将在后台运行
disown
或nohup
),通常在SSH会话结束后将无法保持进程运行。
尽管每个人都说要使用disown
(已经开始执行此过程之后,您唯一的选择),nohup
甚至在中运行命令screen
,如果您想查看该命令的所有输出,这将非常有用...我是screen
..我仍在尝试使用Linux的最新主流发行版,仅将工作置于后台并退出并不会导致所有正在运行的进程消失。必须存在全局设置或其他内容。我正在一些较旧的系统(slackware 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
将是运行最好的办法,即使我的剧本写的日志文件或什么..我从来没有需要使用disown -a
或nohup
除非有人出完整的偏执。也许有人可以阐明默认情况下bash的行为方式?也许某些系统管理员更改了大型Shell的默认设置,以防止其用户的进程使系统过载。
不幸的是,终止的SSH会话可能导致tmux或屏幕被杀死。这是因为systemd
注销会话后将终止所有子进程。
您可以在logind.conf
(/etc/systemd/logind.conf
)中更改此设置:
KillUserProcesses=no
代替 :
cmd options;
在之前添加nohup
:
nohup cmd options &
然后,您将可以通过以下方式查看控制台标准输出:
tail -f nohup.out