`
zhengdl126
  • 浏览: 2508226 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

定时器cron,crontab,nohup

阅读更多

 

#vim /etc/crontab (需要加root )

*/10 * * * * root /bin/sh /etc/memcached_check.sh >/dev/null 2>&1
00 01 * * * root /bin/sh /data0/sh/shell_apache_access.sh >/dev/null 2>&1

01 5 * * * root /bin/sh /var/comm_twa/bin/clear_his.sh > /dev/null 2>&1

 

 

#crontab -e (不需要加root )

01 5 * * * /bin/sh /var/comm_twa/bin/clear_his.sh > /dev/null 2>&1

 

 

重新启动cron
# /etc/rc.d/init.d/crond restart

service crond restart

 

 

 

 

 

------------------------------- nohup

 

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束 ,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程nohup就是不挂起的意思 ( no hang up)。

该命令的一般形式为:nohup command &

如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
  nohup command > myout.file 2>&1 &


使用 jobs 查看任务。
使用 fg %n 关闭。

 

 

 

我们很多程序并不象mysqld一样可以做成守护进程,可能我们的程序只是普通程序而已,一般这种 程序即使使用 & 结尾,如果终端关闭,那么程序也会被关闭。为了能够后台运行,我们需要使用nohup这个命令,比如我们有个start.sh需要在后台运行,并且希望在 后台能够一直运行,那么就使用nohup:
            nohup /root/start.sh &

 

 

 

 

 

============ 同步时间

 

00 3 * * * root /usr/sbin/ntpdate 192.168.101.18 ; /sbin/hwclock -w
50 8 * * * root /usr/sbin/ntpdate 192.168.101.18 ; /sbin/hwclock -w

 

 

============

 

/etc/crontab

 

 

问题: /var/spool/clientmqueue目录占用空间超过100G
原因: cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了/var/spool/clientmqueue目录下的那些文件,日积月累可能撑破磁盘。
解决: 1)直接手动删除:ls |xargs rm -f  ; 2)彻底解决:在cron的自动执行语句后加上 >/dev/null 2>&1



Crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序
使用cron服务.用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它
cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务


cron.d/       是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面
cron.deny     /etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户
cron.monthly/ 是每月执行一次的job
cron.weekly/  是每个星期执行一次的job
cron.daily/   是每天执行一次的job
cron.hourly/  是每个小时执行一次的job

crontab 文件  cron 的主配置文件

 


root查看自己的cron设置:crontab -u root -l
 crontab -u jushan -l
编辑的内容有一些格式和约定,输入:crontab -u root -e


要启动 cron 服务,使用 /sbin/service crond start 命令。要停止该服务,使用
/sbin/service crond stop 命令。推荐你在引导时启动该服务。
---------------------某个用户

根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保
存在 /var/spool/cron 目录中,并使用创建它们的用户身份来执行

 

 

要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令。
使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。
该文件使用的格式和 /etc/crontab 相同

 

 

crontab -l

crontab -e

 

------------------

注意crontab的格式时间为5列,格式出错会没法保存报错如下:
no crontab for root – using an empty one
crontab: installing new crontab
“/tmp/crontab.XXXXSUkg7y”:1: bad command
errors in crontab file, can’t install.
Do you want to retry the same edit?

 

 

/etc/rc.d/init.d/crond restart

 

 

 

 

*/1 * * * *  /usr/sbin/ntpdate 192.168.36.1 2>/dev/null 1>/dev/null

 

 

 

 

 

------------基本知识:

crontabl -l 当前用户的crontab

 crontab -u stone -l

 

 

 



在/etc目录下有一个crontab文件,这里存放有系统 运行的一些调度程序 。每个用户可以建立自己的调度crontab。 /usr/lib/cron/cron.allow表示谁能使用crontab命令。

可以用#vim /etc/crontab 打开文件看看里面的内容,如同下面的基本格式。

----理解1:每月每天每小时的第 0 分钟执行一次 /bin/ls :
* 0 * * *  root /bin/ls    //不需要测试,只要理解

第一道第五个字段 的整数取值范围及意义是:
0~59 表示分
1~23 表示小时
1~31 表示日
1~12 表示月份
0~6 表示星期(其中0表示星期日)


-----理解2:在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :
*/20 6-12 * 12 * /usr/bin/backup


--------测试如下:crontab备份数据库
vim创建文件/var/www/html /web-sale/qing/lime/bakmysql

输入:
rq=` date +"%Y%m%d"`(键盘最左上侧的符号,不是单引号)
tar zcvf /var/www/html/web-sale/qing/lime/mysql$rq.tar.gz /var/lib/mysql
或者写成
rq=` date +"%Y%m%d"`
mysqldump --all-databases -u root -p**** > /var/www/html/web-sale/qing/lime/mysql$rq.tar.gz

// /var/lib/mysql 是MySQL 库文件存放的目录



chmod +x /var/www/html/web-sale/qing/lime/bakmysql
修改/etc/crontab
#vi /etc/crontab
增加:
00 10 * * * root /var/www/html/web-sale/qing/lime/bakmysql
表示每天10点钟执行备份

 

 

 

-----------------------------------f1 f2 f3 f4 f5  command

分 时 日 月 周 命令

f1 — 分钟,从 0 到 59 之间的任何整数
f2 — 小时,从 0 到 23 之间的任何整数
f3 — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期)
f4 — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等)
f5 — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等)
command — 表示要执行的任务(可以使运行linux系统命令,也可以是执行你自行编写的linux脚本命令。)

* 的作用:
星号(*)可以用来代表所有有效的值。比如:月份值中的星号,表示在满足其它制约条件后每月都执行该命令。
当 f1 为 * 时表示每分钟都要执行 command,f2 为 * 时表示每小时都要执行任务,其余类推

整数间的短线(-)的作用 :
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推

整数间的正斜线(/)可以用来指定间隔频率:
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推

整数间的逗号(,)的作用 :
当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其余类推

crontab的常用例子 :

#每天早上7点执行一次 /bin/ls :
0 7 * * * /bin/ls

#每天早上6点10分
10 6 * * * date

#每两个小时
0 */2 * * * date

#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date

#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date

#1月份日早上4点
0 4 1 jan * date

linux系统的WEB服务器管理员经常用到crontab的例子 :

#在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup

#每晚的21:30重启apache。
30 21 * * * /etc/init.d/apache2 restart

#每月1、10、22日的4 : 45重启apache
45 4 1,10,22 * * /etc/init.d/apache2 restart

#每周六、周日的1 : 10重启apache。
10 1 * * 6,0 /etc/init.d/apache2 restart

#在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0,30 18-23 * * * /etc/init.d/apache2 restart

#每星期六的11 : 00 pm重启apache。
0 23 * * 6 /etc/init.d/apache2 restart

#每一小时重启apache
* */1 * * * /etc/init.d/apache2 restart

#晚上11点到早上7点之间,每隔一小时重启apache
* 23-7/1 * * * /etc/init.d/apache2 restart

#每月的4号与每周一到周三的11点重启apache
0 11 4 * mon-wed /etc/init.d/apache2 restart

#1月1日的4点重启apache
0 4 1 jan * /etc/init.d/apache2 restart

 

 

----------------

0 11 * * * /bin/sh /usr/local/test_home/worksh/cron_env.sh
/usr/local/php/bin/php /usr/local/test_home/web_app/party/public/week_send.php >/dev/null 2>&1

vim /usr/local/test_home/worksh/cron_env.sh
#!/bin/sh

export TEST_HOME=/usr/local/TEST_home
export PHP_ENV=TEST
export LANG=en_US.UTF-8

$*

 

 

======================php脚本

接受参数数组 $argv

 

/usr/local/webserver/php/bin/php /tmp/sms.php 134×××   test

 

 

 

 

============================= 防止脚本运行冲突

 

想到一个问题,如果在crontab里有个定时任务设置为一分钟执行一次,但是它执行的时间可能会超过一分钟,此时crontab一分钟后会再次运行该脚本吗?这样会不会出现冲突呢?网上找了下,说可以用Linux中的进程锁控制crontab执行的并发问题。

给一个shell脚本加锁,使用flock命令。

一般格式:
flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command...

常用选项:
-s, --shared :获得一个共享的锁。
-x, --exclusive :获得一个独占的锁。
-u, --unlock :移除一个锁,通常是不需要的,脚本执行完后会自动丢弃锁。
-n, --nonblock :如果没有立即获得锁直接失败而不是等待。
-w, --timeout :如果没有立即获得锁就等待指定的时间。
-o, --close :在运行命令前关闭文件的描述符。用于如果命令产生子进程时会不受锁的管控。
-c, --command :在shell中运行一个单独的命令。
-h, --help :显示帮助。
-V, --version :显示版本。

测试一下看看:
在/home目录下建立一个test.sh。

vim /home/test.sh

输入:

#!/bin/bash
wget --limit-rate=200k -P /tmp http://cachefly.cachefly.net/100mb.test

运行一个超过一分钟的命令。

chmod +x /home/test.sh

编辑crontab:

crontab -e

输入:

*/1 * * * * /usr/bin/flock -xn /var/run/test.lock -c '/home/test.sh'

设置每一分钟执行一次。

重启服务:

service crond restart

这样只有第一个进程执行完毕后,才会执行当前的下一个进程。在第一个进程执行过程中,下一分钟crontab运行flock检测到获得不了锁,就直接退出,直到第一个进程执行完,flock再次获得锁。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics