거북이의 쉼터

(2022.03.21) 자동 실행 쉘 스크립트 구현 본문

코딩 삽질/KAIST PINTOS (CS330)

(2022.03.21) 자동 실행 쉘 스크립트 구현

onlim 2022. 3. 21. 20:59

쉬어(?)가는 차원에서 오늘은 COW는 더 안 건들이고 다른 걸로 놀아(?)볼 것 이다. 바로 자동으로 여러번 채점 코드를 돌리는 프로그램이다. 이전에 핀토스를 진행할 때는 multi-oom 용도로 100번인가 돌리는 코드를 만들었었는데 이렇게 또 만들게 되었다. 사실 안 만들고 그냥 운에 맡기려고 했는데, 그러기에는 COW에서 다소 불안한 요인이 발견되어 만들게 되었으니 결국 이 스크립트는 핀토스와 땔래야 땔 수 없는 운명인가보다. 그나저나 저 쉘은 참 발음이 애매하다. 영어로 shell일텐데 왜 표기는 수-엘로 발음되는 쉘로 표기하는거지... 셸이 더 낫지 않나?

 

뻘소리 그만하고 이제 본격적으로 짜 보자. 자동으로 채점하기 위해서는 실패할 때마다 걸러주고, 아무것도 실패한 것이 없으면 화면에 ALL PASS라고 뜨도록 해줄 것이다. 인터넷의 여러 곳을 참조해서 기본적인 문법에 맞춰 간단하게 1번만 실행하도록 하는 코드를 짜 봤다.

make clean >> /dev/null 
make >> /dev/null 
flag=true
make check | while read line;
do
	if [[ $line == *"FAIL"* ]]; then
		flag=false
		echo $line
	fi
done

if [[ $flag == false ]]; then
	make grade
	mv "./build/grade" "./grade_0"
else
	echo "ALL PASS"
fi

실패할 경우, 실패 요인을 분석하기 위해 실행 결과가 남는 grade 파일을 옮기도록 했다. 실행을 시켜서 테스트해보자. 아직 warning이 떠서 지저분하고, 무엇보다 진행도가 안 보여서 심심하다. 진행도를 보여주도록 한다.

make clean > /dev/null 2>&1 
make > /dev/null 2>&1
flag=true
make check | while read line;
do
	if [[ $line == *"FAIL"* ]]; then
		flag=false
		echo $line
	elif [[ $line == *"pintos"* ]]; then
		echo $line
	fi
done

if [[ $flag == false ]]; then
	make grade
	mv "./build/grade" "./grade_0"
else
	echo "ALL PASS"
fi

이제 지저분한 것이 하나도 없고, 실행되는 테케도 보인다. 정상적으로 ALL PASS가 작동되는지 보기 위해 끝까지 기다려보았다. threads 프로젝트가 이틀 뒤 제출이라 그냥 돌리긴 했는데, mlfqs 때문에 꽤 오래 걸린다. 그래도, 정상 실행되는 것을 보았다. 이제 for문만 추가하면 완벽하다. 아래와 같이 구현을 끝낸다.

for ((i = 0; i < 20; i++)); do
	make clean > /dev/null 2>&1 
	make > /dev/null 2>&1
	flag=true
	make check | while read line;
	do
		if [[ $line == *"FAIL"* ]]; then
			flag=false
			echo $line
		elif [[ $line == *"pintos"* ]]; then
			echo $line
		fi
	done

	if [[ $flag == false ]]; then
		make grade
		mv "./build/grade" "./grade_$i"
	else
		echo "ALL PASS"
	fi
done

사실 좀 더 복잡하게 하려면 플젝 번호와 반복횟수를 외부에서 지정하게도 할 수 있지만 플젝 개수도 얼마 안 되는데 그냥 내부 코드를 수정하도록 한다. 이제 남은 건 컴퓨터의 중노동 뿐이다. 물론 내 것이 아닌 학교에서 제공한 서버가... 미안하다. 화이팅!

Comments