[閒聊] 排程系統

作者: 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