ubuntu 下执行定时任务

时间:2021-10-20 21:33:45

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/\r//" 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

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

ubuntu 下执行定时任务

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

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

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

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

sudo service cron restart

3.看一下结果

vim /home/postgres/time.log

ubuntu 下执行定时任务

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

# 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天执行一次。