您的位置:首页 > 运维架构 > Linux

linux crontab -e报错 || 不执行 || expected unqualified-id before

2017-05-22 15:00 218 查看
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,[b]TDBPro.cpp:3: 错误:expected unqualified-id before ‘using’  
---- class A的定义必须加分号 class A {……}
[/b]

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下定时任务(秒级别)的实现

方法一:巧用crontab命令

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”

注意,做秒级自动执行时,个人觉得需要考虑脚本本身的实行时间。

2、crontab定时任务不执行的原因
若是做完了crontab -e添加完任务,并且任务也存在,但是却没有按照任务指定时间执行,则检查

  1)查看日志  --- 默认情况下,crontab中执行的日志写在/var/log下

2)查看crontab 是否启动成功,检测crontab 服务是否启动,

       /etc/init.d/crond status 

     没启动则要用下面命令
         /etc/init.d/crond start

3)若不是上面原因,则重启下crond服务,命令为

      使用 /etc/init.d/crond restart

      或者service crond restart(Centos7下为systemctl restart crond)
3)查看命令中操作的文件是否存在,当前用户是否有操作该文件的权限,定时任务的执行人

3. Linux中设置服务自启动的三种方式 (ret系列)

c语言 出现错误 expected unqualified-id before

你自定义函数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
{
...
};  //就是这个分号

C++的类为什么要加分号

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 <iostream>
 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<<x<<y;
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  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  crontab 定时任务