[闲聊] 排程系统

楼主: laechan (挥泪斩马云)   2017-12-31 11:10:18
严格来说,这东西不是一个系统。
times_check.c 每一心跳时间(两秒),会呼叫一次 times_check 函数,
然后它会去 keys(times_check) 得到时间序数阵列,接着
mixed tmps2=({});
tmps2=times_check[tmps[i]];
代表 tmps2 存的是一个 mixed 资料,而且它是两层的阵列,因为同一
个时间序数可能要执行两件以上的工作,也就是 ({ ({}),({}),..})。
接着
if(catch(ob=find_object_or_load(tmps2[ii][1])))
continue;
call_other(ob,"times_check",tmps2[ii][0],
tmps2[ii][1],
tmps2[ii][2]);
代表 tmps2[ii][1] 存的是欲呼叫目标的档名。
接着
> call times_check;return_times_check
times_check=
([ "1514689570" : ({
({ "/d/aty/bird/room/boat1",
"/d/aty/bird/room/boat1",
({ "start_plane" })
}),
}),
"xxxxxxxxx" : ({
.
.
}),
])
换言之,一般的排程,只需要 tmps2[ii][1]、times[ii][2] 的资料
就行了,tmps2[ii][0] 的资料可以随便给或做其它用途。
这时就产生三种写法,不论哪一种,都会有 /cmds/std/_crontab.c
一、在 /open/cmds/times_check.c 里面附加 crontab 处理函数
这个理论上可以,不过如果写错或呼叫错,times_check 可能会
有心跳停止的情况发生,我是想尽量避免这种情况。
二、建立 /open/cmds/crontab.c
也就是多加载一个系统物件(但是该物件不必有心跳),然后再让
/cmds/std/_crontab.c 去呼叫 crontab.c,里头就包含了排程所
需的函数,并由 crontab.c 去控制所有经使用者设定的排程。
不过我不太喜欢这样,我不太想让 preload 再去多加载一个档案
三、直接就由 /cmds/std/_crontab.c 去操控一切
这个可以,并建立 /open/cmds/crontab.o 储存盘。
采三的做法的话,就是由 _crontab.c 去呼叫 times_check 建立呼叫
排程,然后 _crontab.c 里头就内建 times_check 函数,类似斜角巷
的华丽与污痕书店的做法:
// names 这时可用来储存排程设定者
int times_check(string names,string files,mixed tmps)
{
if(!times_check)
if(catch(times_check=find_object_or_load("/open/cmds/times_check")))
return 1;
.
.
// 对下一次排程做设定
if(sk/10 > 300)
times_check->set_times_check(names,shop_files,({tmps[0],sk}),sk/50);
else
times_check->set_times_check(names,shop_files,({tmps[0],sk}),sk/10);
return 1;
}
上面的意思是说,在 cmd_crontab 里本来就会针对使用者要设定的
排程,先对 times_check 做了第一次 set_times_check,后续就由
times_check.c 定期呼叫 /cmds/std/_crontab.c 的 times_check
函数来执行相关工作。
下一篇将整理排程有哪些型态种类,并说明如何透过 crontab 指令
去设定这些排程。比较可行的做法是透过 input_to 做引导式设定,
然后最后如 betla 指令那样可撰写脚本档再让指令做 read。
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com