linux任务计划cron
任务计划配置文件
/etc/crontab
每个用户的任务计划文件位于
/var/spool/cron/
下,以用户名命名的文件
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
- 格式:前五个
*
分别代表分钟(-0-59);小时(0-23);日(0-31);月(0-12);周(0-6)
"1-5":表示1-5这个范围;"1,3":表示1或者3;"*/2":表示被2整除的数字,比如小时,就表示每隔2小时的意思
- user-name:任务计划的属主
command to be executed:要执行的具体命令(命令最好为绝对路径,以确保能执行)
systemctl start crond.service
:确保服务是启动状态ps aux |grep crond
或者systemctl status crond
检查服务状态选项:
a.
-e
:增加,编辑任务计划b.
-r
:删除任务计划c.
-l
:列出任务计划d.
-u
:指定用户
chkconfig工具(系统服务管理)
多用于CentOS6及以前版本,CentOS7中几乎不怎么使用chkconfig这个工具
关于chconfig的一些常用用法:
chkconfig --list
:列出所有服务及状态
[root@localhost ~]# chkconfig --list
注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。
如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。
欲查看对特定 target 启用的服务请执行
'systemctl list-dependencies [target]'。
netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
network 0:关 1:关 2:开 3:开 4:开 5:开 6:关
chkconfig --level 3 network 0ff
:关闭network服务3级别
[root@localhost ~]# chkconfig --level 3 network off
[root@localhost ~]# chkconfig --list
注意:该输出结果只显示 SysV 服务,并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。
如果您想列出 systemd 服务,请执行 'systemctl list-unit-files'。
欲查看对特定 target 启用的服务请执行
'systemctl list-dependencies [target]'。
netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
network 0:关 1:关 2:开 3:关 4:开 5:开 6:关
chkconfig --level 345 network off
:关闭network服务345级别chkconfig --del network
:删除network服务chkconfig --add network
:增加network服务
如果要自定义一个启动服务,启动服务的前提是文件必须是脚本且有一些固定的格式(参考network服务),文件路径必须在
/etc/init.d/
下
systemd管理服务
列出所有service及其描述信息(是否load、active、running等)
命令:systemctl list-unit --all --type=service
与systemd相关的几个常用命令
systemctl enable crond.service
:让crond.service服务开机启动systemctl disable crond.service
:不让crond.service服务开机启动systemctl stop crond.service
:停止crond.service服务systemctl start crond.service
:启动crond.service服务systemctl restart crond.service
:重启crond.service服务systemctl status crond.service
:检查crond.service服务状态systemctl is-enabled crond.service
:检查crond.service是否开机启动
[root@localhost ~]# systemctl enable crond.service
[root@localhost ~]# systemctl is-enabled crond.service
enabled
[root@localhost ~]#
[root@localhost ~]# systemctl disable crond.service
Removed symlink /etc/systemd/system/multi-user.target.wants/crond.service.
[root@localhost ~]# systemctl is-enabled crond.service
disabled
unit介绍
unit是由一个与配置文件名同名的名字和类型组成的(例如:avahi.service unit有一个具有相同名字的配置文件)守护对应进程的一个封装单元
查看系统中所有的unit:
命令:ls /usr/lib/systemd/system
unit类型:
- service :系统服务
- target :由多个unit组成的组
- device :硬件设备
- mount :文件系统挂载点
- automount :自动挂载点
- path :文件或路径
- scope :不是由systemd启动的外部进程
- slice :进程组
- snapshot :systemd快照
- socket :进程间通信套接字
- swap :swap文件
- timer :定时器
unit相关的命令
systemctl list-units
:列出正在运行的unitsystemctl list-units --all
:列出所有的unit,包括失败和inactive的等systemctl list-units --all --state=inactive
:列出状态inactive的unitsystemctl list-units --type==service
:列出状态为active的servicesystemctl is-active crond.service
:查看crond.service服务是否为active
target介绍
systemd target使用target单元文件描述,target单位文件扩展名是.target,target单元文件的唯一目标是将其他systemd单元文件通过一连串的依赖关系组织在一起
系统为了方便管理,使用target来管理unit
一个service属于一种类型的unit
多个unit组成了一个target
一个target里面包含多个service
systemctl list-unit-files --type=target
:查看系统中所有targetsystemctl list-dependencies multi-user.target
:查看multi-user.target下面有哪些unitsystemctl get-default
:查看系统默认的targetsystemctl set-default multi-user.target
:将multi-user.target设置为默认target- 查看sshd.service这个服务属于哪一个target
cat /usr/lib/systemd/system/sshd.service
文件中[Install]下面的部分会显示
[root@localhost ~]# cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=forking
PIDFile=/var/run/sshd.pid
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
anacron
anacron 可以在每天、每周、每月(时间轮回天数可以自己指定)服务启动时便会将所有服务置为Ready状态,只等时间一到,便执行任务
- 查看的配置文件`/etc/anacrontab
[root@zyxlinux01 zhouqiang]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
首先前两行注释,告诉你文件是做什么用的
第5、6行是定义基本环境变量,保证程序可以正常运行
最后是默认配置下所执行的任务,也是最重要的,任务配置部分。分四部分:
a.period in days
:轮回天数(即是指任务在多少天内执行一次,monthly 就是一个月(30天)内执行,weekly 即是在一周之内执行一次。其实这种说法不太好,因为它用的不是人类的日历来定启动任务的时间,而是利用天数,像"每月",是指在"每月"执行的任务完成后的三十天内不再执行第二次, 而不是自然月的"三十天左右",不管什么原因(比如关机了超过一个月),三十天后 anacron 启动之时该任务依然会被执行,"周"任务同理。)
b.delay in minute
: 轮回内的重试时间(意思有两部分,一个是 anacron 启动以后该服务 ready 暂不运行的时间(周任务的 70 delay 在 anacron 启动后70分钟内不执行,而处于 ready 状态),另一个是指如果该任务到达运行时间后却因为某种原因没有执行(比如前一个服务还没有运行完成,anacron 在 /etc/init.d 的脚本中加了一个 -s 参数,便是指在前一个任务没有完成时不执行下一个任务),依然以周任务和月任务为例,周任务在启动 anacron 后的 70 分钟执行,月任务在服务启动后 75 分钟执行,但是,如果月任务到达服务启动后 75 分钟,可是周任务运行超过5分钟依然没有完成,那月任务将会进入下一个 75 分钟的轮回,在下一个 75 分钟时再检查周任务是否完成,如果前一个任务完成了那月任务开始运行。这里有一个问题,如果周任务在后台死掉了,成僵尸进程了,难道月任务永远也不执行?)
c.job-identifier
: 任务描述(anacron 每次启动时都会在 /var/spool/anacron 里面建立一个以 job-identifier 为文件名的文件,里面记录着任务完成的时间,如果任务是第一次运行的话那这个文件应该是空的。这里只要注意不要用不可以作为文件名的字符串便可,可能的话 文件名也不要太长);其实就是anacron运行时,会去检查“/var/spool/anacron/这部分”文件中的内容,内容为一个日期,根据这个日期判断下面的第四部分要不要执行。 比如说这里写的是cron.daily,然后/var/spool/anacron/cron.daily文件中记录的日期为昨天的话,那anancron执行后就行执行这一行对应第四行的动作
d.command
: 具体命令(仅仅是你想运行的命令; /usr/bin/run-parts,可以一次运行整个目录的可执行程序)
- 实战自运行任务,写一个
/etc/cron.daily/wall.cron
第一步:
vim /etc/anacrontab
#period in days delay in minutes job-identifier command(去掉注释)
然后在末尾加入一行:
1 1 anacron.test /etc/cron.daily/wall.cron
第二步:删除 /var/spool/anacron目录中的文件后重新启动 anacron 服务,等一分种过去之后屏幕上又会输出成功的信息:anacron is running!
任务完成之后用 ps -A 查看运行中的进程,会发现 anacron 在运行完所有任务之后自动退出了
anacron 完成所有任务退出之后,如果不关机或者重新启动 anacron 服务,进入下一个时间轮回,由谁来启动那些任务呢?可以在 anacrontab 指定一个很大很大的天数,让 anacron 永远也不退出(36500一百年够了吧。要不系统会每隔一个月调用一次 anacron
使用xinetd管理网络应用服务
Xinetd机制介绍:
在Linux系统的早期版本中,有一种称为inetd的网络服务管理程序,也叫作“超级服务器”,就是监视一些网络请求的守护进程,其根据网络请求来调用相应的服务进程来处理连接请求。inetd.conf则是inetd的配置文件。inetd.conf文件告诉inetd监听哪些网络端口,为每个端口启动哪个服务。在任何的网络环境中使用Linux系统,第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,这样黑客就少了一些攻击系统的机会,因为服务越多,意味着遭受攻击的风险越打。用户可以查看“/etc/inetd.conf”文件,了解一下inetd提供和开放了哪些服务,以根据实际情况进行相应的处理。而在Linux7.X的版本当中则使用xinetd(扩展的超级服务器)的概念对inetd进行了扩展和替代.
xinetd的默认配置文件是
/etc/xinetd.conf
。其语法和/etc/inetd.conf
完全不同且不兼容。它本质上是/etc/inetd.conf
和/etc/hosts.allow
,/etc/hosts.deny
功能的组合
系统默认使用xinetd的服务可以分为如下几类:
标准internet服务:http、telnet、ftp等;
信息服务:finger、netstat、systat;
邮件服务:imap、pop3、smtp;
RPC服务:rquotad、rstatd、rusersd、sprayd、wall;
BSD服务:comsat、exec、login、ntalk、shell talk;
内部服务:chargen、daytime、echo等;
安全服务:irc;
其他服务:name、tftp、uucp、wu-ftp;
下面是一个典型的/etc/xinetd.conf文件的例子:
# vi xinetd.conf
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
includedir /etc/xinetd.d
从文件最后一行可以清楚地看到,/etc/xinetd.d目录是存放各项网络服务(包括http、ftp等)的核心目录,因而系统管理员需要对其中的配置文件进行熟悉和了解。
一般说来,在/etc/xinetd.d的各个网络服务配置文件中,每一项具有下列形式:
service service-name
{
Disabled //表明是否禁用该服务
Flags //可重用标志
Socket_type //TCP/IP数据流的类型,包括stream,datagram,raw等
Wait //是否阻塞服务,即单线程或多线程
User //服务进程的uid
Server //服务器守护进程的完整路径
log_on_failure //登陆错误日志记录
}
其中service是必需的关键字,且属性表必须用大括号括起来。每一项都定义了由service-name定义的服务。
Service-name是任意的,但通常是标准网络服务名,也可增加其他非标准的服务,只要它们能通过网络请求激活,包括localhost自身发出的网络请求。
每一个service有很多可以使用的attribute,操作符可以是=,+=,或-=。所有属性可以使用=,其作用是分配一个或多个值,某些属性可以使用+=或-=的形式,其作用分别是将其值增加到某个现存的值表中,或将其值从现存值表中删除。
用户应该特别注意的是:每一项用户想新添加的网络服务描述既可以追加到现有的/etc/xinetd.conf中,也可以在/etc/xinetd.conf中指定的目录中分别建立单独的文件,RedHat 7.x以上的版本都建议采用后一种做法,因为这样做的可扩充性很好,管理起来也比较方便,用户只需要添加相应服务的描述信息即可追加新的网络服务。
RedHat 7.x默认的服务配置文件目录是/etc/xinetd.d,在该目录中使用如下命令可以看到许多系统提供的服务:
#cd /etc/xinetd.d
#ls
chargen cvspserver daytime-udp echo-udp ntalk qmail-pop3 rexec rsh sgi_fam telnet time-udp chargen-udp daytime echo finger pop3 qmail-smtp rlogin rsync talk time wu-ftpd
然而,上述的许多服务,默认都是关闭的,看看如下文件内容:
#cat telnet
# default: off //表明默认该服务是关闭的
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
disable = yes //表明默认该服务是关闭的
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
服务的开启与关闭
使用/etc/xinetd.d目录下的文件进行配置
针对上面列出的关于telnet的例子,用户想要开启服务,只需要通过使用vi 编辑器改写该文件为如下内容:
service telnet
{
disable = no //将该域置为“no”,则表明开启该服务
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
然后,需要使用/etc/rc.d/init.d/xinetd restart来激活Telnet服务即可。相对应的,如果用户想要关闭某个不需要的服务,则将上述的disable = no改为disable = yes即可,这样就修改了服务配置,并且再次使用/etc/rc.d/init.d/xinetd restart来启用最新的配置.
systemd添加自定义系统服务设置自定义开机启动的方法
- 服务权限
systemd有系统和用户区分;系统(/user/lib/systemd/system/)、用户(/etc/lib/systemd/user/).一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。
- 创建服务文件
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c/etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Description : 服务的简单描述
Documentation : 服务文档
Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。
Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile:pid文件路径
ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecReload:指定单元停止时执行的命令或者脚本。
ExecStop:指定单元停止时执行的命令或者脚本。
PrivateTmp:True表示给服务分配独立的临时空间
Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置
Alias:为单元提供一个空间分离的附加名字。
RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also:指出和单元一起安装或者被协助的单元。
DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例
- 重载服务
systemctl enable nginx.service
就会在/etc/systemd/system/multi-user.target.wants/目录下新建一个/usr/lib/systemd/system/nginx.service 文件的链接
- 操作服务
#启动服务
$ sudo systemctl start nginx.service
#查看日志
$ sudo journalctl -f -u nginx.service—
Logs begin at 四 2015-06-25 17:32:20 CST.
—6月 25 10:28:24 Leco.lan systemd[1]: Starting nginx – high performance web server-
6月 25 10:28:24 Leco.lan nginx[7976]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
6月 25 10:28:24 Leco.lan nginx[7976]: nginx: configuration file /etc/nginx/nginx.conf test is successful
6月 25 10:28:24 Leco.lan systemd[1]: Started nginx – high performance web server.
#重启
$ sudo systemctl restart nginx.service
#重载
$ sudo systemctl reload nginx.service
#停止
$ sudo systemctl stop nginx.service