首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Scala创建一个被监禁的环境需要什么?

为Scala创建一个被监禁的环境需要什么?
EN

Stack Overflow用户
提问于 2014-04-09 07:36:22
回答 2查看 321关注 0票数 3

我是一个网站的开发者,程序员可以提交在游戏中互相竞争的机器人。我试图将Scala添加到我们支持的语言列表中,但我在这里遇到了麻烦。

问题是,每个机器人都是从自己的监狱运行的,我不能让scala从监狱(Linux系统)运行,因为我收到一个错误,说找不到可执行文件。在监狱外,一切都很完美。所以我漏掉了一些放进监狱的东西。我有所有的Java依赖库,整个jvm文件夹和整个scala文件夹。但还有其他的东西不见了,我不知道它会是什么。

下面是编译脚本的重要行(我认为它可以正常工作)

代码语言:javascript
运行
复制
#compile
scalac -sourcepath src/ -d bin/ `find src/ -name '*.scala'`
#create runscript
echo "#!/bin/sh" > bin/run_ai
echo "cd / && ./scala -Djava.security.manager -cp bin/ -J-Xss8m -J-Xmx450m '$MAIN'" >> bin/run_ai

run_ai是从监狱运行机器人时调用的脚本,$MAIN是要运行的主要scala文件。就像我说的,在监狱外这一切都很好。

这是在监狱里创造一切所需的脚本。显然我漏掉了一些重要的东西。

代码语言:javascript
运行
复制
mkdir -p lib64 bin lib/x86_64-linux-gnu usr/lib/x86_64-linux-gnu scala jvm proc

cp /lib64/ld-linux-x86-64.so.2 lib64/

cp /bin/sh bin/

#These dependency libraries are actually copied from the Java mkjail script.
#Using 'ldd /usr/bin/scala' returns "not a dynamic executable" in the shell.
#For other languages, it gives a nice list of dependencies, scala not :(
cp /lib/x86_64-linux-gnu/libgcc_s.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libz.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libm.so.6 lib/x86_64-linux-gnu/
cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 lib/x86_64-linux-gnu/

mount -o bind /proc proc
echo "bound /proc"
mount -o remount,ro proc
echo "remounted /proc"

#adding jvm to jail
mount -o bind /usr/lib/jvm jvm
mount -o remount,ro jvm

#adding scala to jail
mount -o bind /usr/share/scala scala
mount -o remount,ro scala

#some extra stuff to run Java from the jail, not actually needed here I think
if [ -f jvm/java-7-openjdk-amd64/jre/bin/java ]
then
    cp jvm/java-7-openjdk-amd64/jre/lib/amd64/jli/libjli.so lib/x86_64-linux-gnu/
    ln -s jvm/java-7-openjdk-amd64/jre/bin/java .
else
    cp jvm/java-6-openjdk-amd64/jre/lib/amd64/jli/libjli.so lib/x86_64-linux-gnu/
    ln -s jvm/java-6-openjdk-amd64/jre/bin/java .
fi

#creating a soft link to run scala. trying to run the bots without the soft link gives the same error, so this is not the problem.
ln -s scala/bin/scala ./scala

因此,简而言之:从监狱运行scala会导致一个错误:"./scala not“,如果我尝试其他东西,比如: /scala/bin/scalac,就会得到相同的错误。(运行在监狱中添加的Java运行良好)。所以我漏掉了一些运行Scala的东西。

我的问题是:运行Scala到底需要什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-09 13:12:58

“scala”可执行引用/usr/bin/env,位于监狱外。

这样做可能会奏效:

代码语言:javascript
运行
复制
java -cp /absolute/path/to/scala-library.jar:path/to/scala/classfiles/ MyMainClass
票数 1
EN

Stack Overflow用户

发布于 2014-04-09 09:00:42

scalascalac是shell脚本。他们可能丢失了envbash可执行文件。

您可以通过添加跟踪代码(例如echo "trace01")来进一步调试脚本,以确定问题所在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22955813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档