V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
fangcan
V2EX  ›  Linux

Linux 命令 crontab 使用疑问

  •  
  •   fangcan · 2020-07-09 16:21:38 +08:00 · 3642 次点击
    这是一个创建于 1377 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题: 目录下直接执行脚本可以正常备份,使用 crontab 失败,没有日志打出

    脚本位置:/home/script/backup_db.sh

    网上搜的试了都不行 求大佬们帮忙看看问题在哪?

    -- 备份脚本:

    #!/bin/bash
    # 定时备份数据库
    BACKUP_PATH=/home/backup/db
    DATETIME=`date +"%Y_%m_%d_%H%M%S"`
    # DATETIME_4_PATH=`date +"%Y_%m_%d_%H%M%S"`
    #mysql 信息
    MYSQL_HOST=127.0.0.1
    MYSQL_USER=root
    MYSQL_PASSWD=123456
    DATEBASE_NAME=test2
    # 判断目录是否存在
    [ ! -d "$BACKUP_PATH" ] && mkdir -p "$BACKUP_PATH"
    # 备份数据库
    # mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWD" --host=$MYSQL_HOST $DATEBASE_NAME | gzip > $BACKUP_PATH/$DATETIME.sql.gz
    /usr/bin/mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWD" --host=$MYSQL_HOST $DATEBASE_NAME > $BACKUP_PATH/$DATETIME.sql
    [ $? -eq 0 ] && echo "备份成功" || echo "备份失败";
    #在$backup 目录下按照时间找 2 天前的名称为*.sql 的文件,-exec 表示执行找到的文件
    find $BACKUP_PATH -mtime +2 -name "*.sql" -exec rm rf {} \;
    echo "备份完成";
    

    -- crontab 配置

    [root@VM_0_6_centos script]# crontab -l
    */1 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
    0 0 * * * /usr/local/qcloud/YunJing/YDCrontab.sh > /dev/null 2>&1 &
    0 */1 * * * ? /home/script/backup_db.sh
    

    -- cron 日志

    没有备份脚本的信息,只有腾讯云自带的一个脚本

    [root@VM_0_6_centos script]# tailf /var/log/cron
    Jul  9 16:01:01 VM_0_6_centos run-parts(/etc/cron.hourly)[14387]: finished 0anacron
    Jul  9 16:02:01 VM_0_6_centos CROND[14557]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    Jul  9 16:03:01 VM_0_6_centos CROND[14736]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    Jul  9 16:04:01 VM_0_6_centos CROND[14923]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    Jul  9 16:05:01 VM_0_6_centos CROND[15098]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    Jul  9 16:06:01 VM_0_6_centos CROND[15287]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    Jul  9 16:07:01 VM_0_6_centos CROND[15465]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    Jul  9 16:08:01 VM_0_6_centos CROND[15686]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    Jul  9 16:09:01 VM_0_6_centos CROND[15865]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    Jul  9 16:10:02 VM_0_6_centos CROND[16066]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
    
    
    第 1 条附言  ·  2020-07-09 17:00:00 +08:00
    问题已解决,是 cron 表达式的问题,在 Linux 上和 java 里面配置是不一样的

    如下:
    Linux: 0 */12 * * * [user] [command] 请只输入红色部分。
    Java(Spring): 0 0 */12 * * * 请只输入红色部分。
    Java(Quartz): 0 0 18 L * ? 2019 请只输入红色部分。
    21 条回复    2020-07-12 14:24:12 +08:00
    AstroProfundis
        1
    AstroProfundis  
       2020-07-09 16:28:26 +08:00
    是不是多了个问号
    heyenyan
        2
    heyenyan  
       2020-07-09 16:30:44 +08:00
    问号去掉就行了 crontab 表达式那儿
    SenLief
        3
    SenLief  
       2020-07-09 16:31:08 +08:00
    那个?是啥意思
    wzq001
        4
    wzq001  
       2020-07-09 16:40:14 +08:00
    为啥我第一反应是,没有 X 权限
    fangcan
        5
    fangcan  
    OP
       2020-07-09 16:44:20 +08:00
    @heyenyan 去掉也不行 0 */1 * * * /home/script/backup_db.sh
    fangcan
        6
    fangcan  
    OP
       2020-07-09 16:44:58 +08:00
    @wzq001 应该是有吧 crontab 是 root 启动的, 手动执行这个脚本也是正常的
    fangcan
        7
    fangcan  
    OP
       2020-07-09 16:45:30 +08:00
    @SenLief cron 表达式 ,网上搜的
    Counter
        8
    Counter  
       2020-07-09 16:57:27 +08:00
    第一反应反应是 cron 里命令的环境变量问题,比如说你要执行 bash 脚本,前面加绝对路径 /bin/bash,类似

    0 0 * * * /bin/bash /usr/local/qcloud/YunJing/YDCrontab.sh > /dev/null 2>&1 &
    wzq001
        9
    wzq001  
       2020-07-09 16:59:20 +08:00
    @fangcan

    同意
    @Counter 老哥的想法,/bin/bash
    fangcan
        10
    fangcan  
    OP
       2020-07-09 17:01:57 +08:00
    感谢各位解答
    本意是每分钟执行一次,Linux 下 0 */1 * * * 变成每个整点执行一次了
    brader
        11
    brader  
       2020-07-09 17:08:51 +08:00
    @fangcan cron 的时间粒度是分钟,每分钟执行,用 * * * * *
    brader
        12
    brader  
       2020-07-09 17:14:03 +08:00
    @fangcan 还有如果你想看到脚本的执行输出,可以重定向日志:
    >/tmp/mysql_backup.log 2>&1
    fangcan
        13
    fangcan  
    OP
       2020-07-09 18:13:04 +08:00
    @brader 是不是在不同的平台(比如 Linux 和 Java 上) cron 的表达式是不一样的? 我看了一个网站上是不一样,试验了下 确实是那样,再跟你求证下
    brader
        14
    brader  
       2020-07-09 18:32:59 +08:00
    @fangcan linux 是系统啊,难道还有 java 系统我没听过吗?哈哈!主要看软件实现的不同吧,有些实现的粒度是分钟级的,有些是秒级的,linux 上常用的 crontab 就是分钟级的时间粒度,像我平时喜欢使用的 ofelia,也是在 linux 上跑的,单它就是秒级的时间粒度,所以说是看软件,不是看系统
    xmge
        15
    xmge  
       2020-07-09 18:44:22 +08:00
    小朋友,你是不是有一个问好?
    aaa5838769
        16
    aaa5838769  
       2020-07-09 19:55:51 +08:00
    问号删除了,脚本加个+x 权限,或者脚本路径前加个 sh
    YuukiIchika
        17
    YuukiIchika  
       2020-07-09 20:06:14 +08:00
    没有细看,意见仅供参考。
    我之前碰到过需要在 crontab 里配置下环境变量的情况,因为有可能 crontab 需要用到的命令不在它的环境变量(PATH)内
    Martin9
        18
    Martin9  
       2020-07-09 22:02:50 +08:00
    想起来以前也遇到过这种问题。
    楼主解释的没太懂啥意思,能再说下是哪有问题吗?
    fangcan
        19
    fangcan  
    OP
       2020-07-10 09:58:09 +08:00
    @Martin9 就是说不同的软件对于 cron 表达式的解析是不同的(选取了不同的字段)

    比如 linux 上的 cron 表达式如下
    分钟 ( 0-59 )
    小時 ( 0-23 )
    日期 ( 1-31 )
    月份 ( 1-12 )
    星期 ( 0-6 )//0 代表星期天

    spring 里面的 schedule 使用的 cron 表达式如下
    Seconds 是 0–59 *,- 标准实现不支持此字段。
    Minutes 是 0–59 *,-
    Hours 是 0–23 *,-
    Day of month 是 1–31 *,-?LW ?LW 只有部分软件实现了
    Month 是 1–12 or JAN–DEC *,-
    Day of week 是 0–7 or SUN–SAT *,-?L# ?L#只有部分软件实现了 Linux 和 Spring 的允许值为 0-7,0 和 7 为周日

    两者之前差了一个 second,也就是秒。
    一开始我拿了 spring 上的表达式用在 Linux 的 cron 上,达不到每分钟一次的效果。所以误以为没生效。
    0 */1 * * * 在 linux 上应该是表示一小时执行一次(待求证)
    Martin9
        20
    Martin9  
       2020-07-10 10:38:46 +08:00
    @fangcan 明白了。谢谢
    yingfengi
        21
    yingfengi  
       2020-07-12 14:24:12 +08:00
    0 */1 * * * sh/home/script/backup_db.sh
    另外脚本文件加个执行权限
    不明白你那里看的资料怎么会有个问号

    https://yingfeng.me/archives/648
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3439 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:04 · PVG 20:04 · LAX 05:04 · JFK 08:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.