赞
踩
systemd是Linux系统中的一个初始化系统和服务管理器。它可以用于在系统启动时自动运行Shell脚本。
crontab是一个用于定时执行任务的工具。我们可以通过编辑crontab文件来设置开机自启动
创建一个Shell脚本文件,例如myscript.sh。该脚本将在系统启动时自动运行。
将脚本文件移动到一个合适的目录,例如/path/to/myscript.sh。
创建一个.service文件
[Unit]
Description=My Script Service
After=network.target
[Service]
ExecStart=/path/to/myscript.sh
[Install]
WantedBy=default.target
将.service文件移动到/etc/systemd/system/目录下。
[Unit] Description=My Script Service After=network.target Description:描述服务的简短说明 After:指定了服务应该在哪个目标(target)之后启动,在这里是"network.target",则服务需要在网络启动之后才能正常运行 [Service] ExecStart=/path/to/myscript.sh ExecStart:指定了服务启动时的执行命令或脚本的路径 [Install] WantedBy=default.target WantedBy:指定了服务应该被关联到哪个目标(target)进行启动,默认为"default.target",意味着服务会随系统的默认目标一起启动。 1234567891011121314 #刷新systemd服务: sudo systemctl daemon-reload #使用以下命令来启用服务并使其在系统启动时自动运行: sudo systemctl enable myscript.service #使用以下命令手动启动服务: sudo systemctl start myscript.service
注意:若你此时手动启动服务,它将会立即运行。但是,系统重启后,服务会自动启动。
打开终端,并输入以下命令来编辑crontab文件:
crontab -e
#在打开的文件中添加以下内容:
@reboot /path/to/myscript.sh
#/path/to/myscript.sh是你的Shell脚本文件的路径
保存并退出编辑器。
crond服务提供两种方式设置定时任务,一种是系统定时任务,一种是普通用户的定时任务。对于系统定时任务,是由系统管理员通过编写/etc/crontab配置文件来设定,crontab任务就存放在/etc/crontab文件里。而普通用户的定时任务可以通过当前用户,crontab -e的方式来编写,编写的定时任务存放在/var/spool/cron/$USER文件里。
crontab依赖于crond服务
service crond status
chkconfig --list|grep crond
软件包由crontabs-1.10-33.el6.noarch提供
rpm -qa|grep crontab
crond服务每隔1分钟会检查/etc/crontab以及/var/spool/cron/$USER文件内容,如果发现新增的,会重新加载变化文件加载至内存(cron日志里会出现:(system) RELOAD (/etc/crontab)),如果在修改配置文件后,想更快的执行,可以重启crond服务,通过检查/var/log/cron日志,发现可以加快几秒钟。
Sep 2 10:54:25 centos6 crond[4050]: (CRON) STARTUP (1.4.4)
Sep 2 10:54:26 centos6 crond[4050]: (CRON) INFO (running with inotify support)
Sep 2 10:54:26 centos6 crond[4050]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
Sep 2 10:55:02 centos6 CROND[4060]: (root) CMD (sh /tmp/test.sh)
Sep 2 10:56:01 centos6 crond[4050]: (*system*) RELOAD (/etc/crontab)
管理员编写系统例行性任务
vim /etc/crontab
在这个配置文件里需要指定执行命令的用户,而在crontab -e中是不需要的,因为crontab -e中就是当前登录用户来执行命令。
SHELL、PATH变量定义了在这个配置文件中的命令如果不写绝对路径时候,在哪里搜寻命令。所以一般建议写成绝对路径来执行。
MAILTO 用于将下面的定时任务执行过程中发生的错误和error发送给哪个用户的邮箱,当然也会记录在/var/log/cron日志中。
有两种方式写法:
1、指定定时间隔,写入执行命令,在这里建议指定执行用户
比如每隔1分钟由root打印一下时间发送到/tmp/time.txt文件里
*/1 * * * * root date>>/tmp/time.txt
2、通过run-parts命令运行指定目录下的所有shell脚本,这种只能在/etc/crontab中配置,在crontab -e中无法配置
比如每天3点50分让root用户执行一下test_sh目录下的所有脚本
(1)创建test_sh目录
mkdir -p /tmp/test_sh
(2)将shell脚本存放在test_sh目录里
shell脚本必须具有执行权限
chmod u+x *
(3)编写定时任务
50 03 * * * root run-parts /tmp/test_sh
系统默认的用于存放shell脚本的目录
[root@centos6 ~]# ls -ld /etc/cron*ly
drwxr-xr-x. 2 root root 4096 Sep 27 2011 /etc/cron.daily
drwxr-xr-x. 2 root root 4096 Sep 27 2011 /etc/cron.hourly
drwxr-xr-x. 2 root root 4096 Sep 27 2011 /etc/cron.monthly
drwxr-xr-x. 2 root root 4096 Sep 27 2011 /etc/cron.weekly
[root@centos6 ~]#
比如每小时执行一次的任务,可以将脚本放在/etc/cron.hourly目录下
编写/etc/crontab,定在每小时15分执行
15 * * * * root run-parts /etc/cron.hourly
crontab的配置文件(格式说明)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
常见的用户的定时配置实例:
说明:
*代表该列每个合法值
%代表换行,如果在crontab中某些命令涉及使用%,比如date命令,那么需要将%进行转义
,代表多个值,每个值用,分割开
a-b代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”
a/b 代表从a值开始,每隔b值执行一次。比如在分钟列上,2/47,从2分钟开始,每隔47分钟执行一次,也就是2,49,2...执行后续命令
在crontab中书写多条命令
*/2 * * * * date >/tmp/test3.log;/bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log
*/2 * * * * date >/tmp/test3.log && /bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log
*/2 * * * * date >/tmp/test3.log||/bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log
常见的命令执行间隔周期的设置
格式设置中,都是将条件进行求并集的关系 每一分钟执行一次command * * * * * cmd 每小时的15,30,45,00执行一次命令 00,15,30,45 * * * * cmd 每天10:15,10:30,10:45执行该命令 15,30,45 10 * * * cmd 每天上午8-11点的第3和15分钟执行 3,15 8-11 * * * cmd 每隔2天的上午8-11点的第3和15分钟执行 3,15 8-11 */2 * * cmd 每个星期一的上午8点到11点的第3和第15分钟执行 3,15 8-11 * * 1 cmd 每月1、10、22日的4 : 45 45 4 1,10,22 * * cmd 每周六、周日的1 : 10 10 1 * * 6,0 cmd 每天18 : 00至23 : 00之间每隔30分钟 0,30 18-23 * * * cmd 晚上11点到早上7点之间,每隔1小时执行一次 * 23-07/1 * * * cmd 每月的4号与每周一到周三的11点【这里是取两个条件的并集,这个很重要】 00 11 4 * 1-3 cmd 其他注意事项: 尽量不要将任务放在同一时间执行。
在crond中,最小定时单位是分钟,要实现每隔多少秒执行,必须借助脚本来实现
每隔2秒执行一次命令 * * * * * sh test.sh #!/bin/bash step=2 for (( i = 0; i < 60; i=(i+step) )); do date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ; sleep $step done exit 0 每隔50秒执行一次命令 50秒均分多少分钟,而1分钟是60秒,那就是50和60的最小公倍数是300秒也就是5分钟。 */5 * * * * sh test.sh #!/bin/bash step=50 for (( i = 0; i < 300; i=(i+step) )); do date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ; sleep $step done exit 0 每隔90分钟执行一次 90分钟能均分多少小时,也就是90分钟和60分钟的最小公倍数180,也就是3个小时,那就每隔3个小时执行一次,而3个小时也能均分一天24小时,这3个小时内由90分钟均分。 * */3 * * * sh test.sh #!/bin/bash step=5400 for (( i = 0; i < 10800; i=(i+step) )); do date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ; sleep $step done exit 0
修改当前用户crontab内容
crontab -e 其实修改的当前用户的crontab内容,文件是在/var/spool/cron/$USER里的内容
修改完成后,重启crond服务,在延迟几秒后执行crontab内容,否则linux的cron服务每隔一分钟去读取一次/var/spool/cron,/etc/crontab,/etc/cron.d
Aug 29 16:16:48 dg1 crond[24132]: (CRON) STARTUP (1.4.4)
Aug 29 16:16:50 dg1 crond[24132]: (CRON) INFO (running with inotify support)
Aug 29 16:16:50 dg1 crond[24132]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
.
.
.
Aug 29 16:17:01 dg1 CROND[24138]: (root) CMD (su - oracle -c /home/oracle/test/test.sh 1>1.log 2>&1)
Aug 29 16:17:01 dg1 CROND[24139]: (root) CMD (root (/usr/sbin/ntpdate 1.cn.pool.ntp.org && /sbin/hwclock -w) &>/dev/null)
修改系统的crontab内容,在/etc/crontab中设定
/etc/cron.deny中的用户不允许执行crontab内容
/etc/cron.daily、/etc/cron.hourly、/etc/cron.monthly 这些目录下的脚本就是每天、每小时、每月要执行的脚本,
/etc/cron.d/下的文件是系统配置的定时crontab内容
crontab命令的使用:
1、查看当前用户的crontab任务
crontab -l
crontab -u oracle -l
2、删除当前用户的crontab内容
crontab -ri
crontab -u oracle -ri
3、编辑当前用户或者指定用户的crontab内容
crontab -e
crontab -u oracle -e
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。