linux中计划任务执⾏脚本
我使⽤的是ubuntu14.4,所以在ubuntu中⼀切正常,在其他linux系统中应该都差不多。
1 计划任务,crontab命令选项:
-u指定⼀个⽤户,
-l列出某个⽤户的任务计划,
-r删除某个⽤户的任务,
-e编辑某个⽤户的任务
2 cron⽂件语法:
分 ⼩时 ⽇ ⽉ 星期 命令
0-59 0-23 1-31 1-12 0-6 command (取值范围,0表⽰周⽇⼀般⼀⾏对应⼀个任务)
可⽤crontab -e命令来编辑,编辑的是/var/spool/cron下对应⽤户的cron⽂件,也可以直接修改/etc/crontab⽂件具体格式如下:
Minute Hour Day Month Dayofweek command
分钟 ⼩时 天 ⽉ 天每星期 命令
每个字段代表的含义如下:linux循环执行命令脚本
Minute 每个⼩时的第⼏分钟执⾏该任务
Hour 每天的第⼏个⼩时执⾏该任务
Day 每⽉的第⼏天执⾏该任务
Month 每年的第⼏个⽉执⾏该任务
DayOfWeek 每周的第⼏天执⾏该任务
Command 指定要执⾏的程序
记住⼏个特殊符号的含义:
"*"代表取值范围内的数字,
"/"代表"每",
"-"代表从某个数字到某个数字,
","分开⼏个离散的数字
3 新增⼀个计划任务
crontab -e 然后添加相应的任务,wq存盘退出。
4 查看计划任务
查看调度任务
crontab -l //列出当前的所有调度任务
crontab -l -u jp //列出⽤户jp的所有调度任务
5 例⼦1,增加⼀个计划任务
* * * * * date > test
6 重启cron服务
service cron restart
注意:每次修改完crontab后,需要重启服务。
可以看到test⽂件每秒钟会进⾏⼀次更新。
例⼦2,写⼀个python脚本,定时执⾏
test2.py⽂件代码如下
#!/usr/bin/python
import time
def fun1():
lastsec = 4
with open("test",'a+') as fobj:
for i in range(2*lastsec):
tm = time.strftime("%Y-%m-%d %H:%M:%S")
fobj.write(tm+"\n")
time.sleep(0.5)
def test():
fun1()
if __name__=="__main__":
test()
要想要执⾏该⽂件,需要添加可执⾏权限
chomd +x test2.py
新增⼀个计划任务
*/2 * * * * /usr/bin/python /home/pc/work/ENV/project/test2.py
注意:为了安全起见所有的路径都需要是绝对路径。
但是没有执⾏,后来上⽹查资料,需要查看⽇志,了半天没有,原来是ubuntu系统默认没有打开⽇志。所以要先打开⽇志,⽇志⽂件在/var/log/cron.log
⽅法:
1) 修改rsyslog⽂件,将/etc/rsyslog.f ⽂件中的#cron.*前的#删掉;
2) 重启rsyslog服务service rsyslog restart
3) 重启cron服务service cron restart
这样就可以看到⽇志了。
8⽉ 27 15:42:01 pc-virtual-machine CRON[10196]: pam_unix(cron:session): session opened for user pc by (uid=0)
8⽉ 27 15:42:01 pc-virtual-machine CRON[10197]: (pc) CMD (/usr/bin/python /home/pc/work/ENV/pr
oject/test2.py)
可以看到计划任务却是执⾏了。但是为什么没有输出⽂件test呢?
然后⾃⼰⼿动执⾏计划任务中的命令,/usr/bin/python /home/pc/work/ENV/project/test2.py
pc@pc-virtual-machine:/var/spool$ /usr/bin/python /home/pc/work/ENV/project/test2.py
Traceback (most recent call last):
File "/home/pc/work/ENV/project/test2.py", line 18, in <module>
test()
File "/home/pc/work/ENV/project/test2.py", line 16, in test
fun1()
File "/home/pc/work/ENV/project/test2.py", line 9, in fun1
with open('test','a+') as fobj:
IOError: [Errno 13] Permission denied: 'test'
给我报错了,仔细⼀看,原来是⾃⼰的脚本有问题,输出的 test⽂件应该是绝对路径,不应该是相对路径,可能是程序不是在脚本所在的⽂件夹⼒执⾏,所以有可能会产⽣权限问题。
所以,经过修改后,test2.py⽂件如下
#!/usr/bin/python
import time
import os
def fun1():
lastsec = 4
curdir = os.getcwd()
filename = os.path.join(curdir,"test")
with open('/home/pc/work/ENV/project/test','a+') as fobj:
for i in range(2*lastsec):
tm = time.strftime("%Y-%m-%d %H:%M:%S")
fobj.write(tm+"\n")
time.sleep(0.5)
def test():
fun1()
if __name__=="__main__":
test()
然后重启cron服务。
ls
startpy.sh test test2.py
可以看到有了输出。
more test
2016-08-27 16:52:01
2016-08-27 16:52:02
2016-08-27 16:52:02
2016-08-27 16:52:03
2016-08-27 16:52:03
2016-08-27 16:52:04
2016-08-27 16:52:04
2016-08-27 16:52:05
⼤功告成
linux中将⼀个脚本⽂件作为⼀个计划任务⼩结,以python脚本为例:
1 创建脚本⽂件test.py,在⽂件开头需要加上下⾯⼀⾏
#!/usr/bin/python
上⾯这⾏的作⽤是说明使⽤那个解释器来执⾏该⽂件,如果不知道python解释器在哪,可以使⽤命令which python来查看
2 给该⽂件添加可执⾏的权限
chmod +x test.py
注意:在脚本⽂件中如果涉及⽂件操作,请使⽤绝对路径,我就是在这上⾯掉坑⾥了。
3 添加计划任务
crontab -e
在⽂件中追加⼀⾏,*/2 * * * * /usr/bin/python /home/pc/work/ENV/project/test.py
保存退出,:wq
4 重启cron服务
service cron restart
结束
正常情况下应该是可以运⾏的,如果有问题,可以按照如下步骤到问题所在
查看cron的log,在/var/log/cron.log,想ubuntu默认情况下是没有开启的,所以要⾃⼰⼿动开启log
如果有log输出,说明计划任务试运⾏正常的,那就有可能是你配置有问题,⾃⼰⼿动运⾏⼀下计划任务中的cmd命令,像我开始那样就是由于脚本本⾝存在问题(不要使⽤⽂件的相对⽬录),如果成功,则说明脚本的环境变量有问题,具体原因就需要查看crontab发送的错误邮件了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论