• Linux 定时任务未执行,手动可以执行成功


    排查方向:

     1.crond服务未启动

    打开方法 crond

    或 service crond start

    2.权限问题  查看是否有执行权限

    3.路径问题  crontab 要写绝对路径

    4.时差问题  服务器客户端出现时差问题 ,以服务器为准

    5.变量问题

    6.自己补充 脚本执行最好在加一个cd 到当前脚本执行目录(我的是没有CD当前目录,手动可以执行脚本,无法定时执行)

    一、crontab未执行

      crontab里面设置定时任务如下:

    1 19 * * * /usr/bin/python3 /home/nola/a.py > /home/nola/logs/a_logs_$(date).log 2>&1

      问题:存放log日志的logs目录没有权限,更改logs目录为777权限

      二、crontab未按当前日期生成日志文件

      date显示的时间格式如下:

       生成日志文件为:a_logs_2019年 09月 02日 星期一 19:37:01 CST.log

      因此自定义时间格式,crontab设置为:

    1 19 * * * /usr/bin/python3 /home/nola/a.py > /home/nola/logs/a_logs_$(date "+ %Y-%m-%d %H:%M:%S").log 2>&1

      还是不能正确生成指定格式日志,crontab正确写法如下:

    1 19 * * * /usr/bin/python3 /home/nola/a.py > /home/nola/logs/a_logs_$(date "+\%Y-\%m-\%d \%H:\%M:\%S").log 2>&1

      注意细节:

        1.  date 后面+与%之间是没有空格隔开的,不同与python编写代码规范

        2. %Y-%m-%d %H:%M:%S 中%前面都需要加上

    针对Linux系统的查询方法(含Redhat、SUSE)
    看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察
    配图为系统aix root用户默认的crontab

      

    转载于:https://www.cnblogs.com/NolaLi/p/11451596.html

    内容补充

    2. crontab与环境变量
    不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
    1)脚本中涉及文件路径时写全局路径;
    2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
    cat start_cbp.sh
    #!/bin/sh
    source /etc/profile
    export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
    /usr/local/jboss-4.0.5/bin/run.sh -c mev &
    3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
    0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

    也可以在脚本加入(环境变量)

    #bin/bash

    . /etc/profile

    . ~/.bash_profile


    3. 其他应该注意的问题
    1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
    2)每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
    3)当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
    4)千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
    5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’`。

  • 相关阅读:
    HTTP协议简介
    Web开发中B/S架构和C/S架构的区别
    软件测试作业三
    Java8 时间处理
    Java EE
    Java 中的 I/O 抽象
    Python 高级 I/O 多路复用
    SQL 与关系代数
    Python 协程与事件循环
    Java SE 5.0
  • 原文地址:https://www.cnblogs.com/JIKes/p/14570729.html
Copyright © 2020-2023  润新知