我在 Ubuntu 14 上设置了一个用户。
如果我检查以用户身份登录时
build@linux-build-agent-1:~$ type rvm | head -1
rvm is a function
然而,这台机器将成为teamcity代理......
当在 teamcity 服务上下文中运行一项作业时,我们会看到
[13:19:11][Step 1/1] RVM is not a function, selecting rubies with 'rvm use ...' will not work.
[13:19:11][Step 1/1]
[13:19:11][Step 1/1] You need to change your terminal emulator preferences to allow login shell.
[13:19:11][Step 1/1] Sometimes it is required to use `/bin/bash --login` as the command.
[13:19:11][Step 1/1] Please visit https://rvm.io/integration/gnome-terminal/ for an example.
我尝试了几个命令试图强制服务在登录 shell 中运行
su - build -c 'source "$HOME/.rvm/scripts/rvm" && /home/build/buildAgent/bin/agent.sh start'
sudo -u build -i bash -lc '/home/build/buildAgent/bin/agent.sh start'
su - build -c '/home/build/buildAgent/bin/agent.sh start'
在脚本中/etc/init.d/
没有效果。
如果我source "$HOME/.rvm/scripts/rvm
在 teamcity 中运行脚本的开头,那么一切都正常,但是有多个用户,我无法要求他们都记住这样做。
这是我安装 RVM 的方式吗?
澄清:
1) 当我通过 SSH 以用户身份登录时,rvm 安装正确且按预期运行。如type rvm | head -1
=> 'rvm is a function' 所示 2) 当服务以用户身份登录时,rvm 无法正常工作。
我希望 rvm 在服务上下文中运行时能够工作,这样用户就不必source "$HOME/.rvm/scripts/rvm
在构建脚本中明确地
通常,此问题是由于未作为登录 shell 运行而导致的。因此,我需要知道如何将服务作为登录 shell 运行。或者如何调整 rvm 以使其可以在登录 shell 上下文之外工作
答案1
当你运行 时su - build -c foo.sh
,你将启动一个登录 shell,然后启动foo.sh
。但是,脚本foo.sh
运行在自己的子 shell 中(这就是脚本的工作方式),并且该 shell 的类型取决于舍邦线脚本。因此,su - -c foo.sh
它不是foo.sh
在登录 shell 中运行,它只是运行登录 shell,然后启动foo.sh
。
因此,编辑/home/build/buildAgent/bin/agent.sh
并更改此内容:
#!/bin/sh
更改为:
#!/bin/sh -l
这将使其在登录 shell 中运行,并使其读取/etc/profile
、和~/.profile
文件并引入您的函数。请注意,这~/.bash_profile
与此无关。这是一个仅由 读取的文件bash
,而不是sh
在 Ubuntu 上实际为 的文件dash
。