0, 前言:
1,linux 新安装的centOS 或小红包系统,第一次执行crontab -e命令报错 Error detected while processing /root/.vim/bundles.vim:
2,Linux下定时任务(秒级别)的实现 --- crontab仅仅可以分钟级别,自定义脚本while true + sleep
3,C++ * a和*&a作为函数的参数时有什么区别? *& 表明是指针应用,跟引用一样的作用
4,TDBPro.cpp:3: 错误:expected unqualified-id before ‘using’ ---- class A的定义必须加分号 class A {……};
5,crontab定时任务不执行的原因
1,问题 第一运行crontab –e报错 OR 新机器crontab –e 报错
[@tc_55_144 HotRankingLoggers]# crontab -e
Error detected while processing /root/.vim/bundles.vim:
line 9:
E492: Not an editor command: Bundle 'gmarik/vundle'
line 14:
E492: Not an editor command: Bundle 'Shougo/neocomplcache'
line 15:
E492: Not an editor command: Bundle'mattn/emmet-vim'
line 16:
……
错误的第一行已经提示vim 问题
解决方案:修改默认编辑器 vim ~/.bashrc:
[root@~]# vim ~/.bashrc
export EDITOR=/usr/bin/vim
[root@~]# source ~/.bashrc
此时即可使用crontab -e来编辑定时任务执行日志
注:通过 /var/log/cron可以查询定时任务执行日志
2, Linux下定时任务(秒级别)的实现
linux下crontab命令可以执行定时任务,但最小粒度为1min,可对其合理运用,以实现秒级别的粒度。
以下代码是实现周期为20s的定时任务,两种方式均可,但稍有不同。
· 修改用户的日常任务:crontab-e
·
* * * * * python test.py
·
* * * * * sleep 20; python test.py
·
* * * * * sleep 40; python test.py
· 修改系统的定时任务:vim/etc/crontab
·
* * * * * root python test.py
·
* * * * * root sleep 20 && python test.py
·
* * * * * root sleep 40 && python test.py
写个后台运行的脚本一直循环运行,然后每次循环sleep 20s。
while true ;do
command
sleep 20 //间隔秒数
done
概述:
crontab的格式是到分的级别
格式如下:
* * * * * command
分时日月周
方法1:###个人觉得这个是比较完美的
[test@B02 tmp]$ crontab -l ###每到20秒执行一次,要写3个,20秒一次,40秒一次,1分钟一次。三个综合下来就是每20秒执行一次
* * * * * sleep 20&&bash/home/test/mosql.sh
* * * * * sleep 40&&bash/home/test/mosql.sh
* * * * * bash /home/test/mosql.sh
方法2:####这个方法个人觉得有个弊端,就是万一脚本进程挂了,就废了。但如果再用crontab* * * * *这个格式去执行,有点违背初衷,而且有点多此一举。
while true do
command
sleep 20 ###睡眠20秒执行一次
done
综上所述,个人比较推荐“方法1”
注意,做秒级自动执行时,个人觉得需要考虑脚本本身的实行时间。
3. Linux中设置服务自启动的三种方式 (ret系列)
你自定义函数delete可能和库函数同名了,把函数名再加几个字符。
今天写了一个occi的C++程序,结果一编译就出了个莫名其妙的错误。信息如下:
g++ -cTDBPro.cpp -I/u01/oracle/rdbms/public -I./
TDBPro.cpp:3: 错误:expected unqualified-id before ‘using’
TDBPro.cpp的第一行代码为头文件包含,第二行为空行,第三行就为using命名空间 std:
#include"TDBPro.h"
using namespacestd;
一开始以为是从windows上传到Linux上ftp的问题,直接到linux上用vi看源文件没发现问题。搞来搞去,最后发现是包含的头文件中定义类的时候没有加分号:
Class xxxx
{
...
}; //就是这个分号
1. #ifndef _TEST_H_
2. #define _TEST_H_
3. class Test
4. {
5. public: //定义成内联的有两种方式
6. int add(int a,int b)//假设我们要将该函数定义为内联的,声明的时候可以不给出inline关键字,可以在实现的时候给出inline关键字
7. { //第一种内联函数的方式在类外给出实现代码,并加关键字inline,这一种是在类里给出实现,不用加inline关键字
8. return a+b; //即使我们没有加inline关键字,它也是内联的
9. }
10. private:
11. int x_;
12. int y_;
13. int z_;
14.}; //最后的分号不能丢
15.#endif //_TEST_H_
16.简单的说,就是规定。类在定义和声明时,结尾必须加分号是C++的强制规定,如果丢失就会编译报错。
在C++中,除函数,及预编译指令外,其它的语句或代码段结尾都必须要加分号。
其中预编译指令是指,以#开头的语句。常见的有,#include,#define, #ifdef, #if, #elif, #else,#endif等。
C++* a和*&a作为函数的参数时有什么区别?
如果你说的是函数的形参,那么
void foo(int* ptr);
是传值调用,比如你这么调用
int a;
int* pValue = &a;
foo(pValue);
这样的情况下,pValue的值是不能被函数foo改变的,也就是pValue肯定是指向a的.
但是如果你这么声明
void foo(int*& ptr);
则是传递引用,那么如果你函数里面
void foo(int*& ptr)
{
ptr = NULL;
}
这样调用过之后,pValue就变成了NULL.而第一种情况pValue是不能被改变的.
引用是C++带来的很重要一个特性,他在很多情况下避免了使用指针.而且,在C++里面,引用是不可以捏造的,比如C你可以很容易弄一个NULL的指针,而引用这不存在NULL引用.
上面的foo函数如果要用C来实现,则必须用指针的指针:
void foo(int** pptr)
{
*ptr = NULL;
}
调用的时候要foo(&pValue)
这种技术很多用在比如定义一个安全删除指针的函数,所谓安全就是,只有当指针为零的时候才执行删除,删除之后,立刻把指针赋值为NULL.
template
inline safe_delete(T*& ptr)
{
if (ptr)
{
delete ptr;
ptr = NULL;
}
}
在C++里面,能不用指针都应该尽量避免,STL里面就大量使用引用.
1//this指针问题 2012年7月18日0:37:13
2 #include
3 usingnamespace std;
4
5
6 classpoint
7 {
8 public:
9
10 int x,y;
11
12 point(int a,intb)
13 {
14 x= a;
15 y = b;
16 }
17
18 void input(int x,inty )
19 {
20
21
22 x= x;
23 y =y;
24 }
25
26
27 void output()
28 {
29 cout< 30 31 } 32 }; 33 34 int main() 35 { 36 37 38 point a(5,5); 39 40 a.input(10,10); 41 a.output(); 42 return 0; 43 44 }