我是一个网站的开发者,程序员可以在游戏中提交相互竞争的机器人。我尝试将Scala添加到支持的语言列表中,但我在这里遇到了麻烦。
问题是每个僵尸程序都从它自己的监狱运行而且我无法从监狱(Linux系统顺便说一句)运行scala,因为我收到一个错误,说找不到可执行文件。在监狱外,一切都很完美。所以我错过了一些可以投入监狱的东西。我有所有的Java依赖库,整个jvm文件夹和整个scala文件夹..但还有一些其他的东西仍然缺失,我无法理解它是什么。
以下是编译脚本的重要部分(我认为它的工作原理)
#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是从jail运行bot时调用的脚本,$ MAIN是要运行的主要scala文件。正如我所说,这一切在监狱外都很好。
这里是创建监狱内所需内容的脚本。在这里,我显然错过了一些重要的东西。
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 found&#34 ;,如果我尝试其他类似的东西:/ scala / bin / scalac,我会得到同样的错误。 (运行jail中添加的Java工作正常)。所以我错过了一些运行Scala的东西。
我的问题是:运行Scala需要什么?
答案 0 :(得分:1)
'scala'可执行文件引用/ usr / bin / env,它位于jail之外。
这可能有效:
java -cp /absolute/path/to/scala-library.jar:path/to/scala/classfiles/ MyMainClass
答案 1 :(得分:0)
scala
和scalac
是shell脚本。他们可能会遗漏env
和bash
个可执行文件
您可以通过添加跟踪代码(例如echo "trace01"
)来进一步调试脚本,以查明问题。