Skip to content

Linux定时任务

方法一:编辑 /etc/crontab文件,添加执行命令

vim /etc/crontab

* * * * * '/usr/lib/php /var/www/laravel/artisan schedule:run >> /var/www/laravel/storage/logs/cron.log 2>&1'
方法二:执行 crontab -e 命令

crontab -e

* * * * * '/usr/lib/php /var/www/laravel/artisan schedule:run >> /var/www/laravel/storage/logs/cron.log 2>&1'
两种方法的区别:
# vim /etc/crontab:系统级任务,多用户均可访问执行;
# crontab -e:用户自定义的定时任务,不是多用户共享的,推荐使用这种方式;
操作命令
# 查看状态
/etc/init.d/cron status
# 开始
/etc/init.d/cron start
# 重启
/etc/init.d/cron restart
# 停止
/etc/init.d/cron stop

基本操作

crontab修改后不需要重启即可生效

# 列出当前登录用户所有定时任务
crontab -l  
# 列出 www用户 所有定时任务
crontab -u www -l  

# 列出XXX用户的所有定时任务,如有没有会提示 no crontab for XXX
crontab -l -u XXX  

# 编辑当前用户的定时任务
crontab -e  
# 编辑 www用户 的定时任务
crontab -e -u www

# 删除当前用户的定时任务
crontab -r  

# 查看crontab的执行情况:  
tail -f /var/log/cron
# 查看crontab的执行log:
tail -f /var/spool/mail/root

解决定时任务重复执行的问题 flock

flock --help 查看命令使用帮助

flock --help
flock (util-linux-ng 2.17.2)
Usage: flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command...
flock [-sxon][-w #] directory [-c] command...
-s --shared Get a shared lock #获得一个共享锁
-x --exclusive Get an exclusive lock #获得一个独占锁,这是默认的
-u --unlock Remove a lock #删除一个锁,通常是不需要的,因为在文件关闭时锁会自动删除
-n --nonblock Fail rather than wait #如果没有立即获得锁,直接失败而不是等待
-w --timeout Wait for a limited amount of time #如果没有立即获得锁,等待指定时间
-o --close Close file descriptor before running command #在执行命令之前关闭保持锁的文件描述符
-c --command Run a single command string through the shell #在shell中运行一个单独的命令
-h --help Display this text #显示帮助
-V --version Display version #显示版本

如:
执行一个定时脚本任务,每2分钟跑一次,将没有推送到外部系统的命令推送到外部系统,为了防止被多次推送的情况,所以需要控制并发,每次只能一个脚本任务在执行

具体实现 :

*/2 * * * * flock -xn /home/*/odp_ohs/data/BmsInvoicePushSap.lock -c '/home/*/odp_ohs/php/bin/php /home/work/odp_ohs/app/mc/script/invoice/PushInvoice2Sap.php'

又如

*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'