• shell编程学习


    1.项目中用到Linux的crontrab

    Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,但是也不是非常复杂,基本上用过一遍就能记住了,关键是要记住/var/spool/cron这个目录。下面看一下具体的用法:

       首先查看一下/etc/crontab文件:
       $ cat /etc/crontab
       SHELL=/bin/bash
       PATH=/sbin:/bin:/usr/sbin:/usr/bin
       MAILTO=root
       HOME=/

       # run-parts
       01 * * * * root run-parts /etc/cron.hourly
       02 4 * * * root run-parts /etc/cron.daily
       22 4 * * 0 root run-parts /etc/cron.weekly
       42 4 1 * * root run-parts /etc/cron.monthly

        前四行是有关设置cron任务运行的环境变量。SHELL变量的值指定系统使用的SHELL环境(该样例为bash shell),PATH变量定义了执行命令的路径。Cron的输出以电子邮件的形式发给MAILTO变量定义的用户名。如果MAILTO变量定义为空字符串(MAILTO=""),电子邮件不会被发送。执行命令或脚本时HOME变量可用来设置基目录。注意:"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。
        文件/etc/crontab中每行任务的描述格式如下:
     
        minute hour day month dayofweek command
     
        minute - 从0到59的整数
        hour - 从0到23的整数
        day - 从1到31的整数 (必须是指定月份的有效日期)
        month - 从1到12的整数 (或如Jan或Feb简写的月份)
        dayofweek - 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
        command - 需要执行的命令(可用as ls /proc >> /tmp/proc或 执行自定义脚本的命令)
     
        root表示以root用户身份来运行
        run-parts表示后面跟着的是一个文件夹,要执行的是该文件夹下的所有脚本
     
        对于以上各语句,星号(*)表示所有可用的值。例如*在指代month时表示每月执行(需要符合其他限制条件)该命令。
        整数间的连字号(-)表示整数列,例如1-4意思是整数1,2,3,4
        指定数值由逗号分开。如:3,4,6,8表示这四个指定整数。
        符号“/”指定步进设置。“/”表示步进值。如0-59/2定义每两分钟执行一次。步进值也可用星号表示。如*/3用来运行每三个月份运行指定任务。
     
        以“#”开头的为注释行,不会被执行。
       补充一个每周的隔一天 备份方式吧: 10 23 * * 0,1,3,5 command  #周一三五七
        如果一个cron任务需要定期而不是按小时,天,周,月来执行,则需要添加/etc/cron.d目录。这个目录下的所有文件和文件/etc/crontab语法相同,查看样例:
     
    # record the memory usage of the system every monday
    # at 3:30AM in the file /tmp/meminfo
    30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
    # run custom scrīpt the first day of every month at 4:10AM
    10 4 1 * * /root/scrīpts/backup.sh
     
    cron 服务会每分钟检查一次/etc/crontab、/etc/cron.d/、/var/spool/cron文件下的变更。如果发现变化,就会下载到存储 器中。因此,即使crontab文件改变了,程序也不需要重新启动。推荐自定义的任务使用crontab -e命令添加,退出后用/etc/init.d/crond restart命令重启crond进程,官方文件说不用重启进程,但我遇到不重启无法运行任务的情况。开始不知道/etc/crontab文件中的 run-parts是什么意思,直接把命令按照/etc/crontab的格式加上总是无法运行,后来才知道run-parts是指后面跟着的是文件夹。
     
    cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
     
    /sbin/service crond start //启动服务
    /sbin/service crond stop //关闭服务
    /sbin/service crond restart //重启服务
    /sbin/service crond reload //重新载入配置
     
    你也可以将这个服务在系统启动的时候自动启动,在/etc/rc.d/rc.local这个脚本的末尾加上:/sbin/service crond start
     
    现在Cron这个服务已经在进程里面了,我们就可以用这个服务了,Cron服务提供以下几种接口供大家使用:
     
    1.直接用crontab命令编辑
     
    cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
     
    crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
    crontab -l //列出某个用户cron服务的详细内容
    crontab -r //删除没个用户的cron服务
    crontab -e //编辑某个用户的cron服务
     
    比如说root查看自己的cron设置:crontab -u root -l
    再例如,root想删除fred的cron设置:crontab -u fred -r
    在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
     
    进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt    注意>>代表在文件尾部追加,而>代表覆盖;
     
    查看服务是否已经运行用 ps -ax | grep cron
    查看调度任务
            crontab -l //列出当前的所有调度任务
            crontab -l -u jp   //列出用户jp的所有调度任务
    删除任务调度工作
             crontab -r   //删除所有任务调度工作
    任务调度执行结果的转向
           例1:每天5:30执行ls命令,并把结果输出到/jp/test文件中
                30 5 * * * ls >/jp/test 2>&1
                注:2>&1 表示执行结果及错误信息
     
    当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。
    如:
    30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &
     
    0 2 * * * /u01/test.sh  >out.file 2>&1 &
    在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。
     
    在这里有有几个数字的意思:
           0表示键盘输入
           1表示标准输出
           2表示错误输出.
    0 2 * * * /u01/test.sh >/dev/null 2>&1 &
    这句话的意思就是在后台执行这条命令,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null 文件,也就是清空。
     
    在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。
     
     

    Linux中,使用 echo $$ 为当前shell的进程号。
    你可以使用ps -A 看你自己shell 的pid。

    $#传递到脚本的参数个数
    $*以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个
    $$脚本运行的当前进程ID
    $!后台运行的最后一个进程的进程ID
    $@与$#相同,但是使用时加引号,并在引号中返回每个参数

    $-显示shell使用的当前选项,与set命令功能相同
    $?显示最后命令的退出状态。0表示没有错误,其它任何值表明有错误

    $0 是脚本本身的名字
    $1 是传递给该shell脚本的第一个参数
    $2 是传递给该shell脚本的第二个参数
    脚本内容如下:
     #!/bin/sh
    echo "number:$#"
    echo "scname:$0"
    
    
    标准输入  (stdin) :代码为 0 ,使用 < 或 <<
    标准输出 (stdout):代码为 1 ,使用 > 或 >>
    标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>
    比如:echo "hello" > /dev/null。

    文件表达式
    -e filename 如果 filename存在,则为真
    -d filename 如果 filename为目录,则为真 
    -f filename 如果 filename为常规文件,则为真
    -L filename 如果 filename为符号链接,则为真
    -r filename 如果 filename可读,则为真 
    -w filename 如果 filename可写,则为真 
    -x filename 如果 filename可执行,则为真
    -s filename 如果文件长度不为0,则为真
    -h filename 如果文件是软链接,则为真
    filename1 -nt filename2 如果 filename1比 filename2新,则为真。
    filename1 -ot filename2 如果 filename1比 filename2旧,则为真。

    整数变量表达式 -eq 等于 -ne 不等于 -gt 大于 -ge 大于等于 -lt 小于 -le 小于等于
    字符串变量表达式
    If  [ $a = $b ]                 如果string1等于string2,则为真
                                    字符串允许使用赋值号做等号 if  [ $string1 !=  $string2 ]   如果string1不等于string2,则为真        if  [ -n $string  ]             如果string 非空(非0),返回0(true)   if  [ -z $string  ]             如果string 为空,则为真 if  [ $sting ]                  如果string 非空,返回0 (和-n类似)  逻辑非 !                   条件表达式的相反
    if [ ! 表达式 ] if [ ! -d $num ]               如果不存在目录$num
        逻辑与 –a                   条件表达式的并列
    if [ 表达式1  –a  表达式2 ]
        逻辑或 -o                   条件表达式的或
    if [ 表达式1  –o 表达式2 ]
  • 相关阅读:
    Visual C# 2008+SQL Server 2005 数据库与网络开发 12.4 自定义控件
    Visual C# 2008+SQL Server 2005 数据库与网络开发 13.1 菜单和菜单事件的创建
    Visual C# 2008+SQL Server 2005 数据库与网络开发 11.6 小结
    vs2005部署报表服务器项目老提示输入用户名密码解决办法
    Excel 文本处理常用函数
    使用APMServ时出现“1、Apache启动失败,请检查相关配置。√MySQL5.1已启动。”错误的终极解决办法:
    <img> 标签的border等属性尽量少用
    时间相减
    全面介绍 Netstat命令的使用技巧!
    apmserver中 mysql的root密码设定
  • 原文地址:https://www.cnblogs.com/shz365/p/5888221.html
Copyright © 2020-2023  润新知