Linux:Shell语言实现《考试控制系统的设计与实现》

来源:互联网 发布:软件图标 编辑:程序博客网 时间:2024/05/22 07:48

利用定时器、进程间信号通信等知识,实现对整个考试过程的控制。

考生通过ssh远程登录到考试服务器:

(1)若首次登录则从特定目录复制试卷到用户主目录并命名为用户的登录名,然后记录考生的登录信息并显示考试注意事项,登录信息包括:用户名、登录IP、时间、考试是否已经结束。设置定时器:15分钟提示、5分钟提示(通过write)、时间用完后结束考试(结束用户登录);

(2)若非首次登录,首先检查是否和首次登录的IP是否一致。若不一致关闭登录;若一致再检查考试是否结束,若已经结束,关闭登录,若考试尚未结束重新设置定时器。

(3)要求为考生显示出考试的注意事项,例如考生通过输入 notice 命令即可显示考试的注意事项。该系统还应该具有 submit 功能,即提交试卷,且试卷提交之后就不允许在同一 IP再登录了。统的设计与实现。

(一)总体框架


(二)关键技术

1、考生登录信息存储管理

考生通过学号登陆后,系统通过“who am I”命令输出重定向到“学号.log”文件。通过“sed”命令,在文件内容的最后添加考试是否结束的状态属性。

主要代码:

who am I>~/$USER.log

sed -i 's/$/& no/g' $USER.log

2、 随机抽题

将3份试题的文件名存入数组,利用考生IP最后一位对3进行取余,抽取对应的试题,保证相邻IP不重题。

主要代码:

farr=(paper_1 paper_2 paper_3)

ip=${arr[4]}   #在数组中取出ip

ipend=${ip:0-2:1}  #取出ip最后一位

num=$(($ipend%3))  #ip最后一位对3取余

if [ $num -eq 0 ]

then  cp/allpaper/${farr[0]}  ~/${farr[0]}  #余数为0取paper_1

elif [ $num -eq 1 ]

then  cp/allpaper/${farr[1]}  ~/${farr[1]}  #余数为1取paper_2

elif [ $num -eq 2 ]

then  cp/allpaper/${farr[2]}  ~/${farr[2]}  #余数为2取paper_3

fi

3、考生信息审核

考生登录系统,首先判断是否存在考生的登录信息文件,若不存在为首次登录,若存在则为非首次登陆。

将登录信息存入字符串数组。

对于非首次登陆的考生,通过从字符串数组中取出IP地址进行核对,判断是否同一考试机器登录。

对于非首次登陆的考生,通过从字符串数组中取出考试结束状态(no/yes),判断考生是否已提交试卷。

示例代码:

if [ "$arr[5]" = "yes" ]  #判断是否交卷

then  killall -9 bash     #强制结束进程

fi

4、定时器管理

通过at命令,设置定时器,临考试结束15分钟提示、5分钟提示(通过write)、时间用完后结束考试。

主要代码:

at ${arr[3]} +45min -f /reminder/reminder_1.sh  #临考试结束15分钟提示

at ${arr[3]} +55min -f /reminder/reminder_2.sh  #临考试结束15分钟提示

at ${arr[3]} +60min -f /reminder/reminder_3.sh  #时间用完后结束考试

5、控制进程间信号通信

在考生提交试卷后,强制结束进程。

示例代码:

killall -9 bash

6、 添加notice、submit命令

 通过为编好的脚本文件起别名的方法,实现考生在考试期间可使用notice、submit命令。

主要代码:

alias notice='/reminder/notice.sh'  #实现notice命令

alias submit='/reminder/submit.sh'  #实现submit命令


0 0