linux任务计划cron、 chkconfig工具、systemd管理服务、unit介绍、 target介绍

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:列出正在运行的unit
  • systemctl list-units --all:列出所有的unit,包括失败和inactive的等
  • systemctl list-units --all --state=inactive:列出状态inactive的unit
  • systemctl list-units --type==service:列出状态为active的service
  • systemctl 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:查看系统中所有target
  • systemctl list-dependencies multi-user.target:查看multi-user.target下面有哪些unit
  • systemctl get-default:查看系统默认的target
  • systemctl 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
posted @ 2017-09-22 22:26  指环王Raul  阅读(918)  评论(0编辑  收藏  举报