|
// bootapp 确保同目录某 .exe 保持运行,使用约定编程简化逻辑
//优点:零配置,复制 bootapp.exe 到需要监控的exe目录,双击 bootapp.exe 就可以了
/*
功能:
确保同目录 .exe 保持运行
缘起:
我有一个程序 dcba.exe, 在 winform 嵌入 IE 控件,程序有时异常退出
在排查到原因前,需要用本程序确保 dcba.exe 保持运行状态
使用方法:
本程序 bootapp.exe 同目录有且只有另一 .exe,比如 dcba.exe
自定义每次延迟秒数,可重命名bootapp.exe为 bootapp-7.exe 表示间隔7秒检查一次
退出方法,程序根目录创建 exit-bootapp.txt
新建工程,命名为 bootapp
把 boootapp.exe 移动到想要要保持运行的 dcba.exe 同一目录
本程序不复杂,主要是用约定编程简化逻辑:
1. 同目录下只有一个其他 .exe,于是就不用指定需要监控的对象
2. 如需更改默认的每次检查的延迟,约定在文件名中表达
3. 退出程序,约定使用特定的文本文件名
*/
// 把个性化变量放在最前面,方便修改
exit = "/exit-bootapp.txt" // 根目录存在此文件就退出程序
logfile = "/bootlog.txt"
// 默认的每次检查延迟毫秒。 非精确数字 10000 可写成 10987方便视觉辨识
wait = 10987 // 约 10 秒
// 本程序exe文件名中,分隔符后面数字表示延迟秒数
separator = "-_" // 分隔符,两者取其一
import fsys
import process
import win
// http://bbs.aardio.com/forum.php?mod=viewthread&tid=31041
import my.log;
log = my.log(logfile)
string.save(logfile, '\r\n\r\n', true) // 加两个空行区分日志
//---
// 根据 exefile 重设延迟时间
// bootapp-10.exe 表示每次检查10秒
setWait = function(exefile, separator){
// 类似 -10.exe 或 _10.exe 是合法的自定义停顿秒数
var sec = string.match( exefile, string.format( "[%s](\d+)\.exe", separator ) )
if (!sec) return ;
sec = tonumber(sec)
if sec > 0 {
wait = sec * 1000
log.print("delay setted to " + sec + " seconds")
}
}
getPath = function(){
var name, path
fsys.enum( io._exedir, "*.exe",
function(dir, filename, fullpath, findData){
if(filename && filename != io._exefile) {
name = filename;
path = fullpath;
return false;
};
}
,false // 忽略子目录
);
return name, path;
}
//---
setWait(io._exefile, separator)
while(true){
// 如果发现约定的文本文件,就退出
if io.exist(exit)
return log.print("Exit:", "found " + exit)
// 同目录(忽略子目录)没有其他 .exe 就退出
var name, path = getPath()
if !name
return log.print("Please put a .exe file in folder:", io._exedir)
// 发现同目录另一 .exe 没有启动,就启动
if !process.find(name) {
process(path)
log.print("boot:", path)
}
win.delay(wait)
}
|
|