• Linux笔记系列


    Linux笔记系列目录

    第一章 shell脚本定时执行之crontab的使用



    前言

    随手记录自己遇到的Linux知识与技巧,方便日常回顾。


    第一章、shell脚本定时执行之crontab的使用

    一、crontab是什么?

    我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

    1. /etc/crontab (文件) 只有root用户能编辑,一般不会改动,默认每天,每周,每月,去执行/etc/cron.daily/etc/cron.hourly,/etc/cron.monthly下的所有可执行文件。
    2. /etc/cron.d (目录) 只有root用户能编辑,当一个项目有自己的定时脚本时,将编辑好的cron文件放入这个目录下即可生效。
    3. var/spool/cron (目录) 使用crontab -e 编辑就是这个目录下的cron文件,文件名是用户名,所有用户都能在这个目录下编辑自己的cron文件。

    /etc/cron.d下的cron文件和/var/spool/cron下的cron文件在格式上有略微的区别,/etc/cron.d下的cron文件在命令前需要指定执行命令的用户,而/var/spool/cron下的cron文件则不需要。
    /etc/cron.d: 30 03 */1 * * root /bin/sh /home/start.sh
    /var/spool/cron: 30 03 */1 * * /bin/sh /home/start.sh

    二、crontab的使用

    常用命令:

    crontab [-u username] [-l|-e|-r]
    选项与参数:
    -u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
    -e :编辑 crontab 的工作内容
    -l :查阅 crontab 的工作内容
    -r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑
    crontab -ir : 删除 crontab 文件前提醒用户

    通常,我们用crontab -e进入当前用户的工作表编辑定时任务,编辑完保存退出。
    注意:用crontab -e 编辑的定时任务三分钟之内是不会执行的,所以在测试的时候,至少时间后推三分钟
    在这里插入图片描述
    crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有:
    "*" 取值范围内的所有数字、"/" 每过多少个数字、"-" 从X 到 Z,从0到10、","数组或者是枚举
    实例:

    实例1:每1分钟执行一次myCommand
    * * * * * myCommand
    实例2:每小时的第3和第15分钟执行
    3,15 * * * * myCommand
    实例3:在上午8点到11点的第3和第15分钟执行
    3,15 8-11 * * * myCommand
    实例4:每隔两天的上午8点到11点的第3和第15分钟执行
    3,15 8-11 */2  *  * myCommand
    实例5:每周一上午8点到11点的第3和第15分钟执行
    3,15 8-11 * * 1 myCommand
    实例6:每月1、10、22日的4 : 45重启smb
    45 4 1,10,22 * * /etc/init.d/smb restart
    实例7:每周六、周日的1 : 10重启smb
    10 1 * * 6,0 /etc/init.d/smb restart
    实例8:每一小时重启smb
    0 */1 * * * /etc/init.d/smb restart
    实例9:晚上11点到早上7点之间,每隔一小时重启smb
    0 23-7/1 * * * /etc/init.d/smb restart
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    三、定时任务配置成功与否校验

    当执行完第二步的操作之后,命令框会提示 installing new crontab,即创建了新的定时任务,没有出现或者出现其他提示则说明定时任务没有添加成功。
    在这里插入图片描述
    添加完之后,我们还可以通过crontab -l 这条指令来查看我们当前服务器上的定时任务列表有没有我们刚刚配置好的定时任务。
    在这里插入图片描述

    四、crontab的限制

    /etc/cron.allow:将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab;
    /etc/cron.deny:将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab
    以优先顺序来说, /etc/cron.allow/etc/cron.deny 要优先, 而判断上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在配置上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 你可以将不想让他运行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个帐号一行!

    五、crontab 配置出错解决办法

    通常我们在配置crontab任务的时候,会出现各种错误,比如最常见的一种错误:
    配置一个每隔 5分钟就刷新data目录下的文件,定时任务这样配置:5/* * * * * cd /data/ && ls
    会报如下错误:

    "/tmp/crontab.sdXvj4":5: bad minute
    
    errors in crontab file, can't install.
    
    Do you want to retry the same edit? 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    出现这样的情况就是我们的语法错误,每隔5分钟写法错了,正确的应该是*/5 * * * * cd /data/ && ls

    由于用户要编辑定时任务(执行crontab -e),系统会在/tmp目录下创建一个临时文件.
    例如上面的crontab.sdXvj4。当我们的语法有问题时,我们需要重新返回编辑这个文件,然后保存退出,直到生成正确的定时任务。

    六、定时任务执行并将执行结果输出到log文件,方便调试和查看

    我们在配置定时任务时,希望看到定时任务的执行信息或者说任务执行失败的信息,怎么做?
    这时,我们可以让定时任务执行的结果输出到某个文本内,即输出重定向。

    linux系统中重定

    1: 表示标准输出(stdout),默认输出到屏幕

    2:表示标准错误输出(stderr),默认输出到屏幕
    在平时我们经常使用如下方法将脚本执行结果重定向:

    bash test.sh >test.out //脚本的标准输出写入到文件test.out ,标准错误输出直接打印在屏幕 等价于:bash test.sh 1>test.out

    bash test.sh >test.out 2>&1 //标准输出和标准错误输出都写入到test.out并且不会互相覆盖,等价于bash test.sh &>test.out

    bash test.sh >test.out 2>test.out //标准输出和标准错误输出都写入到test.out,会出现互相覆盖的问题,正常情况不推荐这样使用

    bash test.sh &>test.out //等价于第二种方法

    比较一下以上几种的效果:

    第一种:错误输出在屏幕,正常输出在文件test.out

    root@mengalong:~/opdir/mengalong/t/t# cat test.sh
    
    #!/bin/bash
    
    t
    
    date
    
    root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out
    
    test.sh: line 2: t: command not found
    
    root@mengalong:~/opdir/mengalong/t/t# cat test.out
    
    Wed Oct 31 11:07:24 CST 2018
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    第二种:错误输出和正常输出均重定向到文件test.out中

    root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>&1
    
    root@mengalong:~/opdir/mengalong/t/t# cat test.out
    
    test.sh: line 2: t: command not found
    
    Wed Oct 31 11:09:02 CST 2018
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第三种:错误输出和正常输出互相覆盖

    root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>test.out
    
    root@mengalong:~/opdir/mengalong/t/t# cat test.out
    
    Wed Oct 31 11:10:36 CST 2018
    
    ot found
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第四种,特殊情况,比较一下bash test.sh 2>&1 >test.out 和 bash test.sh >test.out 2>&1 的区别:

    root@mengalong:~/opdir/mengalong/t/t# bash test.sh 2>&1 >test.out
    
    test.sh: line 2: t: command not found
    
    root@mengalong:~/opdir/mengalong/t/t# cat test.out
    
    Wed Oct 31 11:12:13 CST 2018
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里只是把 2>&1 放在了 >test.out 前边,但是结果却不是像我们想象的那样,错误和正常输出都进入test.out 文件。这是因为, bash test.sh 2>&1 >test.out 这个命令中, 2>&1 的时候,只是把错误输出重定向到了标准输出,而此时标准输出的默认值是屏幕,因此实际等价于标准错误输出被重定向到了屏幕,而非文件。因此重定向需要注意顺序。

    再看一下这个例子:

    01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log
    
    • 1

    按照上边的概念分析,这种写法应该等价于./test.sh >test.log 2>&1 ,脚本执行的输出和标准错误输出全部重定向到 test.log。但是实际情况却是test.log文件中并没有任何内容。

    这是因为 crontab 默认使用的shell环境为 /bin/sh, 而/bin/sh 并不支持 &>>test.log 这种重定向方法,因此我们看到的效果是test.log 中没有内容。

    因此解决问题的方法就是将crontab的重定向方法进行修改:

    01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1
    
    • 1

    友情提示:
    crontab执行过程中,如果脚本输出没有重定向,那么会默认给系统用户发邮件,邮件内容一般存储在 /var/mail/$user 中,如果不清理就会打满服务器根分区,最终导致机器无法登陆。因此推荐的crontab命令写法如下:

    01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1
    
    • 1

    第二章、使用步骤

    1.引入库

    代码如下(示例):

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import warnings
    warnings.filterwarnings('ignore')
    import  ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.读入数据

    代码如下(示例):

    data = pd.read_csv(
        'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
    print(data.head())
    
    • 1
    • 2
    • 3

    该处使用的url网络请求的数据。


    总结

    提示:这里对文章进行总结:

    例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 相关阅读:
    uniapp 微信对接地图的三种操作
    如何利用 RPA 实现自动化获客?
    使用轻量应用服务器搭配宝塔面板搭建可道云kodbox私有云网盘的方法教程
    关于我用iVX沉浸式体验了一把0代码项目创建
    接雨水问题
    3. 判断数组的方式有哪些?
    Linux 回顾总结
    gpt-4o看图说话-根据图片回答问题
    计算机等级考试—信息安全三级真题十
    职责链设计模式
  • 原文地址:https://blog.csdn.net/qq_42603181/article/details/126603020