zoukankan      html  css  js  c++  java
  • Linux中计划任务执行脚本crontab-简洁版

    我使用的是ubuntu16,所以在ubuntu中一切正常,在其他linux系统中应该都差不多。

      1 计划任务,crontab命令选项:
         -u指定一个用户,
         -l列出某个用户的任务计划,
         -r删除某个用户的任务,
         -e编辑某个用户的任务

      2 cron文件语法:

        分     小时   日       月       星期     命令
             0-59   0-23   1-31   1-12     0-6     command     (取值范围,0表示周日一般一行对应一个任务)

      可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件
    具体格式如下:
           Minute Hour Day Month Dayofweek   command
           分钟     小时   天     月       天每星期       命令
    每个字段代表的含义如下:
         Minute             每个小时的第几分钟执行该任务
         Hour               每天的第几个小时执行该任务
         Day                 每月的第几天执行该任务
         Month             每年的第几个月执行该任务
         DayOfWeek     每周的第几天执行该任务
         Command       指定要执行的程序

      

      记住几个特殊符号的含义:

            "*"代表取值范围内的数字,

            "/"代表"每",

            "-"代表从某个数字到某个数字,

            ","分开几个离散的数字

      3 新增一个计划任务

        crontab -e 然后添加相应的任务,wq存盘退出。

      4 查看计划任务

        查看调度任务
             crontab -l //列出当前的所有调度任务
             crontab -l -u jp   //列出用户jp的所有调度任务

      5 例子1,增加一个计划任务

      * * * * * date > test

      6 重启cron服务

        service cron restart

      注意:每次修改完crontab后,需要重启服务。

      可以看到test文件每秒钟会进行一次更新。

      

      例子2,写一个python脚本,定时执行

      test2.py文件代码如下

    复制代码
    #!/usr/bin/python
    import time
    
    def fun1():
            lastsec = 4
            with open("test",'a+') as fobj:
                    for i in range(2*lastsec):
                            tm = time.strftime("%Y-%m-%d %H:%M:%S")
                            fobj.write(tm+"
    ")
                            time.sleep(0.5)
    
    def test():
            fun1()
    if __name__=="__main__":
            test()
    复制代码

      要想要执行该文件,需要添加可执行权限

      chomd +x test2.py

      新增一个计划任务

      */2 * * * * /usr/bin/python /home/pc/work/ENV/project/test2.py

      注意:为了安全起见所有的路径都需要是绝对路径。

      但是没有执行,后来上网查找资料,需要查看日志,找了半天没有,原来是ubuntu系统默认没有打开日志。所以要先打开日志,日志文件在/var/log/cron.log

      方法:

        1) 修改rsyslog文件,将/etc/rsyslog.d/50-default.conf 文件中的#cron.*前的#删掉;
        2) 重启rsyslog服务service rsyslog restart
        3) 重启cron服务service cron restart

      这样就可以看到日志了。

    8月 27 15:42:01 pc-virtual-machine CRON[10196]: pam_unix(cron:session): session opened for user pc by (uid=0)
    8月 27 15:42:01 pc-virtual-machine CRON[10197]: (pc) CMD (/usr/bin/python /home/pc/work/ENV/project/test2.py)

    可以看到计划任务却是执行了。但是为什么没有输出文件test呢?

      然后自己手动执行计划任务中的命令,/usr/bin/python /home/pc/work/ENV/project/test2.py

     

    pc@pc-virtual-machine:/var/spool$ /usr/bin/python /home/pc/work/ENV/project/test2.py
    Traceback (most recent call last):
    File "/home/pc/work/ENV/project/test2.py", line 18, in <module>
    test()
    File "/home/pc/work/ENV/project/test2.py", line 16, in test
    fun1()
    File "/home/pc/work/ENV/project/test2.py", line 9, in fun1
    with open('test','a+') as fobj:
    IOError: [Errno 13] Permission denied: 'test'

    给我报错了,仔细一看,原来是自己的脚本有问题,输出的 test文件应该是绝对路径,不应该是相对路径,可能是程序不是在脚本所在的文件夹力执行,所以有可能会产生权限问题。

    所以,经过修改后,test2.py文件如下

    复制代码
    #!/usr/bin/python
    import time
    import os
    
    def fun1():
            lastsec = 4
        curdir = os.getcwd()
        filename = os.path.join(curdir,"test")
            with open('/home/pc/work/ENV/project/test','a+') as fobj:
                    for i in range(2*lastsec):
                            tm = time.strftime("%Y-%m-%d %H:%M:%S")
                            fobj.write(tm+"
    ")
                            time.sleep(0.5)
    
    def test():
            fun1()
    if __name__=="__main__":
            test()
    复制代码

    然后重启cron服务。

    ls
    startpy.sh test test2.py

    可以看到有了输出。

    more test

    2016-08-27 16:52:01
    2016-08-27 16:52:02
    2016-08-27 16:52:02
    2016-08-27 16:52:03
    2016-08-27 16:52:03
    2016-08-27 16:52:04
    2016-08-27 16:52:04
    2016-08-27 16:52:05

    大功告成!!!

    linux中将一个脚本文件作为一个计划任务小结,以python脚本为例:

      1 创建脚本文件test.py,在文件开头需要加上下面一行

      #!/usr/bin/python

      上面这行的作用是说明使用那个解释器来执行该文件,如果不知道python解释器在哪,可以使用命令which python来查看

      2 给该文件添加可执行的权限

      chmod  +x  test.py

      注意:在脚本文件中如果涉及文件操作,请使用绝对路径,我就是在这上面掉坑里了。

      3 添加计划任务

      crontab -e

      在文件中追加一行,*/2 * * * * /usr/bin/python /home/pc/work/ENV/project/test.py

      保存退出,:wq

      4 重启cron服务

      service cron restart

      结束

    正常情况下应该是可以运行的,如果有问题,可以按照如下步骤找到问题所在

      查看cron的log,在/var/log/cron.log,想ubuntu默认情况下是没有开启的,所以要自己手动开启log

      如果有log输出,说明计划任务试运行正常的,那就有可能是你配置有问题,自己手动运行一下计划任务中的cmd命令,像我开始那样就是由于脚本本身存在问题(不要使用文件的相对目录),如果成功,则说明脚本的环境变量有问题,具体原因就需要查看crontab发送的错误邮件了。

  • 相关阅读:
    restful风格 webapi 发送put delete请求 405 错误
    mysql 连接数据库间接性连接异常
    .net core 发布到centos The configuration file 'appsettings.json' was not found and is not optional. 找不到文件
    .net list<int>、int[]参数类型 前端调用传参方法
    long? long 可空类型转换
    EF 多对多循环引用序列化失败 解决办法
    HTML5学习之HTML标记类型
    电脑高手常用的5个按钮!(太有用了!留下了!)
    final关键字用法总结
    Java程序员面试失败的5大原因 //转自:极客网
  • 原文地址:https://www.cnblogs.com/GavinSimons/p/9136585.html
Copyright © 2011-2022 走看看