2014-04-09 1 views
3

저는 프로그래머가 게임에서 서로 경쟁하는 봇을 제출할 수있는 웹 사이트의 개발자입니다. 지원되는 언어 목록에 스칼라를 추가하려고하는데 여기에 문제가 있습니다.스칼라에 대한 감옥 환경을 만드는 데 필요한 것

문제는 모든 봇이 자체 jail에서 실행되며 jail (Linux 시스템 btw)에서 실행할 스칼라를 얻을 수 없다는 것입니다. 실행 파일을 찾을 수 없다는 오류가 발생하기 때문입니다. 감옥 밖에는 모든 것이 완벽하게 작동합니다. 감옥에 가야 할 물건이 없어졌습니다. Java 의존성 라이브러리, 전체 jvm 폴더 및 전체 스칼라 폴더가 있습니다. 그러나 여전히 누락 된 일부 다른 요소가 있으며 그럴 수 있습니다. 여기

가 run_ai가 감옥에서 봇을 실행할 때 호출되는 스크립트가

#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 

(그것이 내가 생각해야으로 작동) 컴파일 스크립트의 중요한 라인이다, $ 주요 메인 스칼라입니다 실행될 파일. 내가 말했듯이,이 모든 것은 감옥 밖에서 잘 작동합니다.

다음은 감옥 내부에서 필요한 모든 것을 만드는 스크립트입니다. 여기서 나는 중요한 것들을 분명히 놓치고 있습니다./스칼라/빈/scalac, 나도 같은 오류가 발생합니다 : 짧은

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". (감옥에 추가 된 Java 실행은 정상적으로 작동합니다). 그래서 나는 스칼라를 돌리기위한 물건을 놓치고있다.

제 질문은 스칼라를 실행하는 데 정확히 필요한 것이 무엇입니까?

답변

1

'scala'실행 파일은 감옥 외부에있는/usr/bin/env를 참조합니다.

이 작동 할 수 있습니다 :

java -cp /absolute/path/to/scala-library.jar:path/to/scala/classfiles/ MyMainClass 
+0

감사합니다! 일종의 해결 방법이지만 Java로 실행하는 것은 완벽하게 작동합니다. – AIJim

0

scalascalac은 쉘 스크립트입니다. 그들은 envbash 실행 파일이 누락되었을 수 있습니다.
문제를 정확히 찾아 내기 위해 추적 코드 (예 : echo "trace01")를 추가하여 스크립트를 디버그 할 수 있습니다.

관련 문제