zoukankan      html  css  js  c++  java
  • ubuntu 下执行定时任务

    Window shell文件在linux系统下执行不了的解决办法

    一些人喜欢用vim来写linux shell script, 但是, 有的人喜欢在Windows下用一些方便的编辑器(比如鼎鼎大名的Notepad++)写好, 然后拷贝文件到linux下, 结果呢, 在执行脚本a.sh的时候, 会出现如下问题:

    [taoge@localhost learn_shell]$ ./a.sh 
    bash: ./a.sh: /bin/bash^M: bad interpreter: No such file or directory
    [taoge@localhost learn_shell]$ 

    什么原因呢, 我们有理由怀疑是文件格式问题? 我们用vim a.sh进入a.sh这个文件, 然后在底部模式下, 执行:set ff查看一下, 结果发现fileformat=dos, 看看, 果然是文件格式问题, 那怎么解决呢?

         方法一:vim a.sh进入a.sh后, 在底部模式下, 执行:set fileformat=unix后执行:x或者:wq保存修改。 然后就可以执行./a.sh运行脚本了。(我亲自试过, 是ok的)

         方法二:直接执行sed -i "s/ //" a.sh来转化, 然后就可以执行./a.sh运行脚本了。(我亲自试过, 是ok的)

         方法三:直接执行dos2unix a.sh来转化, 然后就可以执行./a.sh运行脚本了。(我的linux上执行dos2unix ./a.sh失败, 但是不要放弃啊, 加个busybox就可以了), 如下:

    dos2unix a.sh 
    bash: dos2unix: command not found
    [taoge@localhost learn_shell]$ busybox dos2unix a.sh 
    [taoge@localhost learn_shell]$

    实际上, 经过上述三种方法修改后, 我们都可以再用:set ff再查一下, 发现a.sh的fileformat果然是unix了。   第三种方法最方便, 建议用第三种!

    执行定时任务的步骤(使用crontab,让linux定时执行shell脚本)

    使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令。例如系统管理员安排一个备份任务使其每天都运行

     

    入门

    # crontab –e

    这样可以已编辑模式打开个人的crontab配置文件,然后加入一下这行:
    0 0 * * * /home/linrui/XXXXXXXX.sh

    这将会在每天凌晨运行 指定的.sh文件

    Cron 各项的描述

    以下是 crontab 文件的格式:

    {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 
    o minute: 区间为 0 – 59 
    o hour: 区间为0 – 23 
    o day-of-month: 区间为0 – 31 
    o month: 区间为1 – 12. 1 是1月. 12是12月. 
    o Day-of-week: 区间为0 – 7. 周日可以是0或7.

    Crontab 示例

    1、在 凌晨00:01运行

    1 0 * * * /home/linrui/XXXX.sh

    2、每个工作日23:59都进行备份作业。

    59 11 * * 1,2,3,4,5 /home/linrui/XXXX.sh   

    或者如下写法:

    59 11 * * 1-5 /home/linrui/XXXX.sh

    3、每分钟运行一次命令

    */1 * * * * /home/linrui/XXXX.sh

    4、每个月的1号 14:10 运行

    10 14 1 * * /home/linrui/XXXX.sh

    Crontab命令的选项

    以下是 crontab 的有效选项:

    crontab –e : 修改 crontab 文件. 如果文件不存在会自动创建。 
    crontab –l : 显示 crontab 文件。 
    crontab -r : 删除 crontab 文件。
    crontab -ir : 删除 crontab 文件前提醒用户。

    ThinkPHP实现定时任务

    项目服务端框架我选用的是ThinkPHP,由于策划案中有需求要定时刷新指定数据,所以在windows平台我使用微软的计划任务调用bat脚本来执行下面的命令来完成

    php index.php /Home/cli

    即使用PHP的CLI模式调用ThinkPHP的入口文件,然后再传入指定控制器完成相应的数据处理。/Home/cli 为我新增的名为CliController的控制器,在类中index方法调用相应处理数据的模块即可。特别注意:在windows平台上执行时在bat脚本中一定要先将当前执行目录切换到index.php所在目录,然后执行php.exe index.php /Home/cli.

    在linux平台下使用的crontab来实现定时任务,通过crontab -e 新增一条命令,具体写法可问问度娘,给出我的配置截图:

    # m h dom mon dow command
    0 6 * * */bin/sh /mnt/share/Web/Cli_timer.sh

    效果就是每天早上6点执行cli_timer.sh脚本,脚本内容如下:

    sh -c "cd /mnt/share/WebServer;php index.php /Home/Cli;"
    这里需要说明的是在linux下如果cli_timer.sh脚本中只包含下面命令
    php index.php /Home/Cli;

    是会报路径包含错误的,所以这里在脚本中将当前工作路径切换到index.php脚本放置的目录,这样就能正常使用了。

    ubuntu上使用cron执行定时任务计划

    在ubuntu下,cron为自带的系统服务。

    任意用户下,输入“crontab -e”即可进入任务编写。相关提示大致如下:

    # Edit this file to introduce tasks to be run by cron.
    #
    # Each task to run has to be defined through a single line
    # indicating with different fields when the task will be run
    # and what command to run for the task
    #
    # To define the time you can provide concrete values for
    # minute (m), hour (h), day of month (dom), month (mon),
    # and day of week (dow) or use '*' in these fields (for 'any').#
    # Notice that tasks will be started based on the cron's system
    # daemon's notion of time and timezones.
    #
    # Output of the crontab jobs (including errors) is sent through
    # email to the user the crontab file belongs to (unless redirected).
    #
    # For example, you can run a backup of all your user accounts
    # at 5 a.m every week with:
    # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
    #
    # For more information see the manual pages of crontab(5) and cron(8)
    #
    # m h  dom mon dow   command

    如果是第一次执行“crontab -e”,会提示选择编辑器,选择合适的编辑器即可。我选择的是“4”,vim。

    Select an editor.  To change later, run 'select-editor'.  
      1. /bin/ed  
      2. /bin/nano        <---- easiest  
      3. /usr/bin/vim.basic  
      4. /usr/bin/vim.tiny  
      
    Choose 1-4 [2]:   

    然后,在最后面添加下面内容,然后保存并退出。

    # test
    3 * * * * date >>/tmp/test.txt

    至于上面这个表达式的说明,请各看官自行度娘或谷歌。

    好了,去看看“/tmp/test.txt”是否有内容吧。

    下面是我期间遇到的几个问题。

    1.输入“crontab -e”,提示“no crontab for root - using an empty one”

    处理:这个是正常的,提示你,当前设定的用户,没有cron任务。

    2.输入“crontab -e”,输入内容后,退出时,提示保存;保存后,任务不能成功添加。

    处理:你选择的编辑器有问题。请在root角色下输入“select-editor”,可以重新进行选择。

    3.编辑完任务并保存后,重启服务的问题。

    有些网文说是“service crond restart”进行服务重启,在这里,需要特别注意的是,在ubuntu下cron服务的重启应该是“service cron restart ”。注意,是“cron”,而不是“crond”。

    Ubuntu使用crontab定时任务

    因为今天想定时执行postgres的一些脚本,所以在网上查一下有一个crontab的命令,就把这个命令的使用记录一下,方便日后查找.

    cron是一个[守护程序]用于在指定的时间内执行行程类的任务,每一个用户都有一个 crontab 文件,来允许他们指定需要执行的内容和时间,此外,系统也有一个 crontab ,用来允许像交替日志和更新本地数据这样有规则的任务。

    环境:Ubuntn 12.10

    1.使用 crontab -e命令

    这个命令比较简单直接输入就可以

    #:crontab -e

    出现如下窗口(第一次会提示你用那个编译器,随便选 一个就行了)

    之后就可以输入你想执行的内容了.

    比如:*/2 * * * * date >> /home/postgres/time.log 它的意思就是每过两分钟就向time.log文件中写入当然的系统时间.

    之后ctrl+X退出保存就行了.

    2.保存crontab之后,我们还要重启crontab服务来使这个任务生效.

    sudo service cron restart

    3.看一下结果

    vim /home/postgres/time.log

    参数说明(我找的很多例子,看看就明白了.)

    # m h  dom mon dow  command

    m 分钟 0-59

    h 小时 0-23

    dow 天1-31

    mon 月 1-12

    dow  星期 1-6  0表示星期天

    command 就是要执行的命令

    ********************************************

    ubuntu 使用sh 无法执行脚本文件的解决方法

    最近刚开始学习linux shell语言

    看的是鸟哥的私房菜,里面有讲到执行shell脚本有两种方法:

    1. 设置执行属性: chmod 755 file

    执行(如果已经在当前目录) :    ./file

    2. 使用:  sh file 执行

    .但是在vmware里装的ubuntu 11.10却无法执行

    #!/bin/bash
    declare -i s
    for (( i = 1; i <= 100;i = i+1 ))
    do 
        s=s+i
    done
    echo "The count is ==> $s"

    使用第二种方法执行时出现 :

    test04_for.sh: 1: declare: not found
    test04_for.sh: 3: Syntax error: Bad for loop variable

    百度了下网上,解决方法:

    在终端中输入:

    sudo dpkg-reconfigure dash

    然后出现的界面中选择 NO

    然后就能正确运行了。

    **********************************************

    Crontab中的除号(slash)到底怎么用?

    crontab 是Linux中配置定时任务的工具,在各种配置中,我们经常会看到除号(Slash)的使用,那么这个除号到底标示什么意思,使用中有哪些需要注意的地方呢?
     
    在定时任务中,我们经常有这样的需求,比如每5分钟查看一下日志,我们可以这么写:
     
    0,5,10,15,20,25,30,35,40,45,50,55 * * * * /command
     
    这样肯定是没有问题的,但是就写书写起来非常复杂,简化一下可以这么写:
     
    0-55/5 * * * * /command
     
    这样的写法已经简化了很多,大家还是觉得麻烦,那么可以这样写:
     
    */5 * * * * /command
     
    怎么样,是不是非常简单明了。这句就表示在0,5,10,15,20,25,30,35,40,45,50,55分钟的时候执行命令,即每隔5分钟执行命令。
     
    由此我们得出除号与范围搭配使用,表示命令执行的步长。
     
    那么我下面这种写法,是否标示每13分钟执行一次命令呢?
     
    */13 * * * * /command
     
    这里就是需要注意的地方。有一些步长是无法用这种方式表达的。只有能够被整除的步长值才能表达与我们理解相一致确切的含义,对于分钟来说只有 */2,*/3,*/4,*/5,*/6,*/10,*/12,*/15,*/30,对于小时来说则只有*/2,*/3,*/4,*/6,*/8,*/12。对于日期来说,如果使用*/5,则不能保证每5天执行一次,到月底的时候可能只执行1天、2天或3天后就停止了,这取决与大小月与平闰年。这是因为 cron 是没有状态的,它不能够记录上次执行的是什么时间,只能根据当前的时间来判断是否需要执行。
     
    而对于*/13这个例子来说,表示在分钟这个范围内,即0-59分钟,任务会每13分钟执行一次。即:0,13,26,39,52,之后再间隔8分钟,就会又重新执行。
     
    再看下面一个例子:
     
    0 6 */2 * * /command 
     
    看到这个我们如果理解成每xx执行就是,每两天的6点钟执行命令。在这里*的范围是1-31,*/2表示任务在奇数天执行,那么在1、3、5、7、8、10、12月,月末最后一天执行后,紧接着第二天仍然后执行,那这就不是每2天执行一次。
  • 相关阅读:
    SpringBoot整合Flyway(数据库版本迁移工具)
    Java并发编程实战 05等待-通知机制和活跃性问题
    Java并发编程实战 04死锁了怎么办?
    Java并发编程实战 03互斥锁 解决原子性问题
    Java并发编程实战 02Java如何解决可见性和有序性问题
    Flutter学习笔记(40)--Timer实现短信验证码获取60s倒计时
    Flutter学习笔记(39)--BottomNavigationBar底部item超过3个只显示icon,不显示title
    Flutter学习笔记(38)--自定义控件之组合控件
    Flutter学习笔记(36)--常用内置动画
    Flutter学习笔记(37)--动画曲线Curves 效果
  • 原文地址:https://www.cnblogs.com/jiangxiaobo/p/8194371.html
Copyright © 2011-2022 走看看