8

我正在使用带有环境模块的集群。这意味着我必须专门加载除默认 (2.13) 以外的任何 R 版本,因此要加载 R 3.0.1,我必须指定

module load R/3.0.1
R

我已经添加module load R/3.0.1.bashrc,所以如果我 ssh 进入服务器并加载 R,它会默认打开 3.0.1。但是,当我在服务器上打开 R(M-x R,起始数据目录:/ssh:myserver)时,它会加载默认的 R 安装(2.13)。

这个问题与前面的问题类似,只是我正在使用本地安装的 emacs 访问服务器上的 R。(ESS 调用 R 的不同安装以及如何在 emacs 中指定 ESS 会话打开的 R 版本?

4

2 回答 2

6

TL;博士

  1. 识别 R 模块的路径:module show R/3.0.1
  2. 添加到您的 .emacs 中:(add-to-list 'tramp-remote-path "/path/to/R-3.0.1/bin")

TRAMP 通过 ssh 调用的 bash 确实会执行其初始化文件,但最终执行哪些文件取决于几件事。~/.bashrc当您使用 TRAMP 连接到服务器时,您可以通过在文件中添加类似的内容来检查您是否完全执行echo "bashrc here"。然后设置变量

(setq tramp-verbose 9)

并尝试连接。现在看看您是否可以在名为*debug tramp/ssh...*.

如果您没有任何其他设置,TRAMP 将远程 shell 调用为/bin/sh( http://www.gnu.org/software/tramp/#Remote-shell-setup ),因此将bash执行( http://www.gnu. org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files)。您还可以查看如何在该缓冲区中调用 shell,相关行将是/etc/profile~/.profile*debug tramp/ssh...*

tramp-open-shell (5) # Opening remote shell `/bin/sh'...done

尝试先添加module load R/3.0.1~/.profile。如果这没有帮助,请尝试bash通过设置强制 TRAMP 以正确的名称调用

(setq explicit-shell-file-name "bash")
(setq shell-file-name "bash")

更新:如果一切都失败了,您可以打开 shell M-x shell,然后 ssh 到您的服务器,该服务器应该负责正确的模块初始化(因为您提到交互式 ssh 连接按预期工作)。一旦在服务器上,启动 R,然后M-x ess-remote让 ESS 知道现有的 R 会话。这样你就完全不依赖 TRAMP。

于 2013-10-28T17:12:09.297 回答
1

当 TRAMP 在远程主机上运行 shell 命令时,它会调用/bin/sh -c. 当像这样调用它时,似乎没有办法告诉sh在初始化时获取任何文件。因此,让我们将 TRAMP 配置为调用/bin/bash -c. 然后bash将 source BASH_ENV,我们可以指向一个配置模块的自定义文件。

因此,首先,将 TRAMP 配置为使用/bin/bash. 为此,我们需要修改tramp-methods变量。它是一个 alist,其中的键是表示连接类型的字符串。我使用"scpx"连接类型,但您可以将其更改为您使用的任何连接类型。

(let ((scpx-method (cdr (assoc "scpx" tramp-methods))))
      (add-to-list 'scpx-method '(tramp-remote-shell "/bin/bash"))
      (add-to-list 'tramp-methods (cons "scpx" scpx-method)))

然后,我们可以配置tramp-remote-process-environment为指向将包含我们的模块配置的文件。

(add-to-list 'tramp-remote-process-environment "BASH_ENV=~/.bash_env")

然后,打开~/.bash_env远程机器上的文件。您需要获取设置模块系统的文件。我们使用不同的模块系统,所以我不完全确定您需要什么文件,但也许您会在/etc/profile.d. 这是我的文件包含的内容:

source /etc/profile.d/z00_lmod.sh
module -q restore

同样,我不熟悉您的模块系统,但第二行只是加载了我的默认模块集。

最后,由于模块系统配置了你的PATH,我们需要让 TRAMP 使用它。默认情况下,TRAMP 仅使用tramp-remote-path. 但如果你添加tramp-own-remote-path,它会拉入PATH.

(add-to-list 'tramp-remote-path 'tramp-own-remote-path)
于 2017-12-14T22:55:00.047 回答