遇到问题 与 解决办法
1. 关于文件类打开操作函数不自动创建不存在的父目录问题
1. crtsurfdata.cpp中,有用到CFile类的成员函数Open
**这里出现了一个问题**,
如果所打开的文件的父目录不存在,它不会自动创建父目录,而是返回false
但在程序里,当我删除ftp目录时,我打开data/ftp/crtsurfdata目录时
日志:
FIle.Open(/home/houlc/qxidc/data/ftp/surfdata/SURF_ZH_20200722230447_3461)失败!
就是因为没有了父目录,
2. **这里有两解决办法**
1:在项目的程序代码里,打开如果 失败,则创建父目录(调用MKDIR函数实现)
2:在库函数的Cfile::Open的代码中,把fopen用FOPEN(这里有调用MKDIR)替换
3. **我的思考**:
1>>这里我想来想去,觉得应该用第一种方法,
尽管我下意识就想用第二种方法,
但是考虑到,库函数不能把项目中所有的需求都考虑的太自动化而不灵活了,
如果采用第二种解决办法,那我以后遇到项目,Open到不存在的目录时,
不想创建它,就想要他的false返回值 怎么办?
2>>所以,就调用MKDIR在项目程序里面,
当CFile::Open返回false时,就MKDIR它就好
----*虽然后来发现吴哥用的第一种方法吧,,,*
不过我还是觉得我的解决办法好,多写一行MKDIR也没费什么功夫
-----**又才发现打开日志的问价CLogFIle::Open也是自动创建父目录**。。。。
无语。。。
不过这可能和需求有关,
因为这是你要写日志,一定是要有指定目录存在的,
如果父目录不存在,那就创建它,
这个写日志的操作是"情景要求明确的",
"然而File::Open的项目情景并不清晰"所以我觉得不能把FOPEN
(打开,打不开就创建)直接写进Open里面,
这样如果不需要自动创建,就直接调用File::Open,
如果需要自动创建,
则在项目程序代码中加一行if false ,MKDIR就好,并没有费多大功夫
2. 如何解决xshell连接成功但无法输入命令
一般都是你在输入命令时,按了Ctrl+s锁定命令行
Ctrl+q即可解锁命令行
3. Linux系统里如何彻底清空中断屏幕
命令:reset
4. Linux命令行上执行操作,不退回命令行的解决办法
使用 1>test.log来重定向操作的输出
如
python GetDeviceData.py 1>websocket_success.log 2>websocket_error.log &
5. 执行程序中, 如果 忽略所有信号,无法退出程序的问题
// 关闭全部的信号和输入输出
void CloseIOAndSignal()
{
int ii=0;
for (ii=0;ii<100;ii++)
{
signal(ii,SIG_IGN); close(ii);
}
}
那么Ctrl+z被忽略,最后程序如果是死循环,会很难退出,用Ctrl+c
也不行,常规杀程序也解决不了,最后用
kill -9 进程编号 命令解决的
6. 关于常驻内存与任务调度的设计
这个程序60s才很快的运行一次,不需要他常驻内存,浪费资源
7. 任务调度crontab
***一、Crontab -e 编辑调度文件***
布置任务:
*/1 * * * * /home/houlc/qxidc/bin/crtsurfdata
【格式:前五个是时间设定段,第六段是要执行的命令段】
【Min hour day month week command】
在以上各个字段中,还可以使用以下的特殊字符:
1)星号(*):代表所有可能的该时间的值,
2)逗号(,):可以用逗号隔开的值指定一个列表范围
3)中杠(-):可以用证书之间的中杠表示一个整数的范围:2-6:2,3,4,5,6,
4)正斜线(/):可以用正斜线指定时间的间隔频率,
例如“0-23/2”表示每两个小时执行一次。
同时,正斜线可以和星号一起使用,
例如*/10,如果用在minute字段,表示没十分钟执行一次
***二、crontab服务***
1)service cron start // 启动服务
2)service cron stop // 关闭服务
2.5)service cron restart //重启服务
3)service cron reload // 重新载入配置
4)service cron status // 查看服务状态
***三、查看服务是否已经运行***
ps -ax | grep cron
```cpp
***四、crontab 命令选项***
1》 -u 指定一个用户
2》 -l 列出某个用户的任务计划
3》 -r 删除某个用户的任务
4》 -e 编辑某个用户的任务
***五、新增任务调度***
1-在命令行输入:crontab -e,然后添加相应的任务,wq存盘退出
2-直接编辑/etc/crontab 文件,即 vi /etc/crontab,添加相应的任务
***六、查看任务调度***
1=1 crontab -l //列出当前所有的调度任务
2=2 crontab -l -u -jp //列出用户jp的所有调度任务
7. 解决“您在”/,/,/,中有新邮件"问题
1》查看文件 mail
2》删除文件 cat /dev/null > /var/spool/mail/houlc
3》禁止系统启动邮件检查
Echo "unset MAILCHECK" >> /etc/profile
这样就不会再有邮件提示了
在这里插入代码片
程序实现的效果
1.通过crontab任务调度,每分钟调用一次/home/houlc/qxidc/bin/crtsurfdata /home/houlc/qxidc/ini/inicode.ini /home/houlc/qxidc/data/ftp/surfdata /home/houlc/qxidc/log/crtsurfdata.log
2.程序自动从原始数据存放的文件夹中提取数据,并生成目标类型的数据结构,存入相应的容器,最后写生成的数据文件,存放到指定的数据文件目录中。
3、程序将程序运行的情况写入日志(标有时间和事件),日志尽可能详细
4、程序最开始忽略了所有的信号,又单独设置了Ctrl+c和kill 退出的中断,确保需要程序推出的时候,程序可以优雅的退出
收获,反思与下一步计划
收获
- 走通了一个小小的数据提取和数据文件生成的程序的大体开发流程
- 进一步丰富和熟悉了自己的函数库
- 实现了一个具体的功能蛮开心的
反思
4. 学习如翻山,走过这座山,方知还有那座山,
学完基础,我以为自己再进一步就可以实际开发了,
结果现在,做了一个项目里的一个小程序,才发现要走的路还很长
5. 我的之前学的很多的基础知识的理解都还很浅薄,实际开发毫无经验,
如果应对稍微复杂一点的开发场景我绝对束手无策,
6. 另外,就眼前要学习做的qxidc项目来说,我也才走了一小步
后边还有很多比较复杂的程序,
7. 涉及到的知识:
ftp协议,ftp采集模块的开发,其他通信协议,oracle环境搭建,oracle的表操作,oracle的事物,shell和环境变量,c语言操作数据库,测试数据处理和入库,工程的组织,oracle的虚表、日期和序列,工程的优化,oracle函数、索引和视图,数据结构设计,数据的处理,更强大 的sql,计算的问题探讨,数据交换子系统,oracle数据库的管理,系统的高可用性,mysql数据库,PostgreSQL数据库,数据库兼容技巧,数据挖掘子系统,htt协议,非结构化数据的存储,数据管理子系统,监控和警告子系统,文件传输系统,app软件服务端。。。
我的天,我还仅仅是写了个采集数据的小程序而已,后面的路还很长
这一年的时间很紧迫了
但是没关系,我一步一步已经学了这么多了,
后面一步一步我也一定可以走完的