Linux使用systemd服务和crontab实现Shell脚本开机自动运行&编辑当前用户或者指定用户的crontab内容crontab -e

简介

systemd是Linux系统中的一个初始化系统和服务管理器。它可以用于在系统启动时自动运行Shell脚本。
crontab是一个用于定时执行任务的工具。我们可以通过编辑crontab文件来设置开机自启动

前提条件

创建一个Shell脚本文件,例如myscript.sh。该脚本将在系统启动时自动运行。
将脚本文件移动到一个合适的目录,例如/path/to/myscript.sh。

使用systemd服务

创建一个.service文件

[Unit]
Description=My Script Service
After=network.target

[Service]
ExecStart=/path/to/myscript.sh

[Install]
WantedBy=default.target

将.service文件移动到/etc/systemd/system/目录下。

service文件内容详解

[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文件:

crontab -e
#在打开的文件中添加以下内容:

@reboot /path/to/myscript.sh
#/path/to/myscript.sh是你的Shell脚本文件的路径

保存并退出编辑器。



linux 定时任务之crontab

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

猜你喜欢

转载自blog.csdn.net/qq_43842093/article/details/135032360