如何让 emacs 保持“屏幕”运行?如果我用 emacs 杀死缓冲区,我会杀死进程吗?

如何让 emacs 保持“屏幕”运行?如果我用 emacs 杀死缓冲区,我会杀死进程吗?

我正在使用 R 会话运行一些 R 代码。

我首先打开 shell,输入内容screen以开始屏幕会话,然后emacs -nw

假设我以 R 开头R,然后运行一些代码,例如> source("script.R")

我如何简单地退出此会话并保持此 R 代码运行?如果我正在使用screen并用 终止缓冲区C-x k,我会终止会话吗?

答案1

如果关闭 emacs,R 进程将被终止。要保持其运行,请在不关闭 emacs 的情况下分离屏幕会话。我认为这是 C-a d默认的。

在您的示例中,您首先screen在终端中打开:

screen

然后启动 emacs,使用-nw以文本模式运行它:

emacs -nw

如果您安装了 ESS,请通过 启动M-x RR。如果您只是在 shell 中运行它(为什么?使用 ESS!),请改为这样做。

现在开始你的分析。例如:

for(i in 1:100){
  Sys.sleep(5)
  print(i)
}

现在使用 分离会话C-a d。您现在可以关闭终端,甚至注销计算机 - 但不要将其关闭!当您想查看工作进展情况时,请打开另一个终端,并使用以下-r标志调用 screen:

screen -r

您将看到 Emacs 内的 R 会话仍在运行:

> Sys.sleep(4)
> for(i in 1:100){
+ Sys.sleep(5)
+ print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8

只要让 emacs 和 R 保持运行,并分离(但不要关闭)屏幕,并且不要关闭计算机,这就是您所需要的。

答案2

Screen是一个终端多路复用器,然后具有服务器/客户端模型。当您启动 screen 时,它会在后台分叉自身以启动服务器,然后前台客户端开始与其通信。这样做的目的是让它继续在后台运行,无论你的客户端发生什么情况(无论它被杀死,如果它通过 ssh 或其他方式运行,你会失去连接)。

要从服务器分离屏幕客户端,请按crtl+,a然后按d。然后,您可以使用screen -ls列出所有正在运行的屏幕会话并附screen -r加到最​​后一个。

但是,如果您在 screen 内的 emacs 内运行 R,则由 emacs 决定何时关闭 R 程序,screen 对此没有发言权。

Screen 还允许您分割窗口并拥有多个窗口。您可以使用它而不是使用 emacs 启动应用程序,以使其即使在退出 emacs 时也能保持运行。

答案3

如果那是你唯一的窗口,杀掉窗口也会杀人screen。只要你有一个窗口打开,screen应该仍然在运行。例如,您可能正在运行R在另一个窗口中。

但通常当你杀死一个窗口时,它里面的东西也会停止,因为screen向它发送了一个信号:

杀死当前窗口。如果有一个执行命令运行然后它被杀死。否则,在窗口中运行的进程(shell)会收到一个HANGUP在这种情况下,窗口结构被删除,屏幕(您的显示器)切换到另一个窗口。当最后一个窗口被销毁时,屏幕退出。终止屏幕后切换到先前显示的窗口。注意:Emacs 用户在杀死一行时应记住此命令。建议不要使用"C-a"作为屏幕转义键或重新绑定kill"C-a K"

如果你正在跑步R在 Emacs 缓冲区中,然后(没有采取任何措施将其放入后台,和/或不使用nohup)然后关闭 Emacs 窗口将需要R与它一起。

您当然可以从屏幕会话中分离(这与杀戮一个窗口):control+Ad

但这有助于阅读手册页

答案4

你在 Emacs 中运行 shell 吗?如果是这样,您可以使用 Unix 作业控制将R脚本置于后台:R脚本运行后,键入Ctrl-C Ctrl-Z返回到 shell 提示符。这将暂停您的脚本。然后键入bg以重新启动刚刚在后台暂停的作业。您可以使用 shell 命令看到该作业正在后台运行jobs

完成您想要的任务的另一种方法是R从头开始在后台启动脚本。看这个链接执行此操作R,或这个链接直接从命令行执行此操作。

相关内容