时间有关的服务

at    crond   anacron

d代表 deamon

/etc/init.d/atd
/etc/init.d/crond
/etc/init.d/anacron


 at
  1,任务是一次性的
  2,设置的时间点过了,就马上执行


[root@li ~]# /etc/init.d/atd start
Starting atd:                                              [  OK  ]
[root@li ~]# chkconfig atd on


[root@li ~]# at 09:47 031711
at> echo "hello" > /dev/pts/2
at> <EOT>  --ctrl+d结束
job 2 at 2011-03-17 09:47


at        
 -l   查看时间job  相当于atq
 -d   删除时间job  相当于atrm
 -c   显示时间job的内容 
 -f   后接一个脚本


[root@li ~]# atq
1       2017-11-03 09:46 a root
[root@li ~]# at -l
1       2017-11-03 09:46 a root
[root@li ~]# file /var/spool/at/a00001017fee0a
/var/spool/at/a00001017fee0a: Bourne shell script text executable
[root@li ~]# vim /var/spool/at/a00001017fee0a
  --任务要执行的内容就在此文件的最后
[root@li ~]# at -c 1 --用命令查看1号job的内容


还有类似下面的时间推移的写法
[root@li ~]# at now + 10 minutes
[root@li ~]# at now + 1 hours
[root@li ~]# at now + 1 weeks
[root@li ~]# at now + 1 months
[root@li ~]# at now + 1 years


[root@li ~]# vim 1.sh

#!/bin/bash

echo -e "1\n2\n3\n4\n5\n6\n7\n8" > /dev/pts/2


[root@li ~]# at 10:07 031711 -f 1.sh
job 8 at 2011-03-17 10:07


[user1@li ~]$ at 10:09 031711
at> touch /home/user1/1
at> <EOT>
job 9 at 2011-03-17 10:09


 at任务的使用限制:
  /etc/at.allow 
  /etc/at.deny
  
/etc/at.allow --在这里可以写上允许执行at的普通用户,一个用户一行;存在的话就不用去考虑at.deny
/etc/at.deny --在这里可以定上拒绝执行at的普通用户,一个用户一行;如果at.allow不存在,才生效


--默认系统只有一个/etc/at.deny,并且为空,也就是说默认系统的任何普通用户都可以使用at服务


===============================================================


  batch   executes commands when system load levels permit; in other words,
               when the load average drops below 0.8, or the value specified  in
               the invocation of atrun.

batch 命令
 当负载小于0.8时,才会执行   ;用法与at 一样


小实验:
[root@li ~]# batch -f 1.sh  --负载小于0.8,立刻执行了

下面做一些操作,比如 cp 一个大文件,把负载提高到0.8以上
[root@li ~]# batch -f 1.sh  --再次运行,没有立刻执行
下面取消cp操作,使用top查看等待负载下降到0.8以下后上面的就会执行(可能有一点时间延迟,应该是程序设计的监控时间间隙在起作用),


补充:使用atrun -l 1.2  --可以把这个负载值设定为1.2

 

===============================================================

crontab


 crontab特点:
  1,能够周期性的运行
  2,时间过了就不执行,等下一个周期再执行


[root@li ~]# /etc/init.d/crond start
Starting crond:                                            [  OK  ]
[root@li ~]# chkconfig crond on


[root@li ~]# vim /etc/crontab   --主配置文件


执行周期时间 执行身份  命令行 目录
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly


分 时 日 月 周


时间格式
 分 时 日 月 周
 01 *  *  *  *
 
分钟: 0-59
小时: 0-24 
日: 1-31   看月份定
月: 1-12
周 0-7    0和7都是代表星期天


   时间格式的几种特殊符号写法
* 代表每分钟,每小时,每日,每星期,每月..........
,       代表分隔时间 1,5,6,7 
- 代表一个时间范围  7-20
/n 代表每隔n个单位   /3

 

01 1,5,12,18,23 * * *  --每天的1,5,12,18,23点的第一分钟
01 * 5-15 * *  --每月的5号到15号的每小时的第一分钟
/2 * * * * --每两分钟
/3 1,3,8 1-5 3-6 7     --每年的3到6月的1到5号的1,3,8点的每三分钟  (只有星期天才行)  


例子1;
vim /etc/crontab

* * * * * root  echo 'crontab'> /dev/pts/2 --每分钟都会去echo一个crontab到/dev/pts/2终端 


例子2;
vim /etc/crontab
* * * * * root  run-parts /etc/cron.minutely --做一个每分钟都会执行的目录,把每分钟都要执行的脚本任务放到这个目录里,注意要有执行权限 


注意:
--修改了/etc/crontab的配置后,不需要重启crond服务,但要保证是开启状态
--写到主配置文件里的要写执行身份,如果后面接的是目录,则要加上run-parts,并且目录内的脚本为可执行

 

 命令设置方法:--不同的用户都能拥有自己的时间任务(当然要对此任务有能执行的权限)


crontab
 -e  --编辑自己的时间任务
 -l --列出自己的时间任务
 -r --删除时间任务
 -i --删除前要求确认

[root@li ~]# crontab -e
30 18 * * * /sbin/init 0 --写上每晚6点30分钟自动关机    注意要root用户写才有效


[root@li ~]# crontab -l  --列出自己的时间任务
30 18 * * * /sbin/init 0 


[root@li ~]# crontab -r  --全删掉自己的时间任务,想要只删除一行或者两行,就要自己去手动删除

crontab任务
/var/spool/cron/*      --*代表用户
  

# cat /var/log/cron      --查看这个日志文件,可以看到所有的与crontab有关的日志记录


用root用户管理普通用户的时间任务
  crontab -e -u d --编辑d民的时间任务
  crontab -l -u d --列出d用户的时间任务
  crontab -r -u d --删除d用户的时间任务


 crontab的使用限制: 和atd服务是一样的


/etc/cron.allow   --写上允许使用crontab的普通用户名,一行写一个;有些文件的话就不考虑/etc/cron.deny
/etc/cron.deny  --写上拒绝使用crontab的普通用户名,一行写一个;如果/cron.allow不存在,才生效 
   


--实际应用时要注意的是:
 如果时间任务比较多的情况下,都是周期性执行,根据任务的需求,负载,时间规定,最好是把各项任务给平均分开,防止任务时间点挤在一起,造成服务器的某一时间点负载过高


============================================================


anacron

 anacron 特点:
  与crond服务配合使用,保证crond没有执行的任务可以延后执行


 配置文件: vim /etc/anacrontab

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

天数  延后时间(分钟) 自定义的名字 执行命令串   目录

1       65      cron.daily              run-parts /etc/cron.daily
7       70      cron.weekly             run-parts /etc/cron.weekly
30      75      cron.monthly            run-parts /etc/cron.monthly

1       65      cron.daily              run-parts /etc/cron.daily
上面这句话的意思为:
 /etc/cron.daily目录内的脚本在1天内没有被执行过,那么就推后65分钟执行,执行完成后,就把时间给记录到/var/spool/anacron/cron.daily文件里


#/etc/init.d/anacron start  --启服务

# cat /var/log/cron   --查看日志会有下面信息,因为前两天讲chkconfig时把这些服务都关了,所以已经有两天没做了,现在启动起来,就会在65分钟后做

Jul  8 11:45:27 li anacron[3104]: Anacron 2.3 started on 2011-07-08
Jul  8 11:45:27 li anacron[3104]: Will run job `cron.daily' in 65 min.
Jul  8 11:45:27 li anacron[3104]: Will run job `cron.weekly' in 70 min.
Jul  8 11:45:27 li anacron[3104]: Jobs will be executed sequentially

 

--一般来说,此服务不需要特定的配置,直接打开就好了


思考题:
现在我有下面的一个自动关机的时间任务
[root@li ~]# crontab -l
30 20 * * *  /sbin/init 0

问:  如果我在晚上20点30分之前手动关闭了电脑,那是否第二天9点30开机后,会在10点35分自动关机呢?


 答案:不能

因为crontab -e编写的时间任务不在/etc/anacrontab文件里定义的三个目录内,并没有任何关系;


有兴趣的可以在/etc/crontab定义一个目录,写上关机脚本,再在/etc/anacrontab里定义这个目录来做实验

 

=================================================================

 

NFS network file system


共享式集群文件系统


 是由sun公司提出的 ,用来做网络之间的文件共享,是一种共享式集群文件系统

 

服务端:   nfs      portmap

客户端:  portmap
 

--nfs服务的描述 
# description: NFS is a popular protocol for file sharing across
 TCP/IP  networks. This service provides NFS server
 functionality,   which is configured via the /etc/exports file.


--portmap服务的描述
# description: The portmapper manages RPC connections, which are
 used by  protocols such as NFS and NIS. The portmap server must
 be running on machines which act as servers for protocols which
 make use of the RPC mechanism.


   
[root@dns ~]# /etc/init.d/portmap stop
Stopping portmap:                                          [  OK  ]

[root@dns ~]# showmount -e 10.1.1.35
mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive

[root@dns ~]# /etc/init.d/portmap start
Starting portmap:                                          [  OK  ]
[root@dns ~]# showmount -e 10.1.1.35
mount clntudp_create: RPC: Program not registered

[root@dns ~]# /etc/init.d/nfs  restart
[root@dns ~]# showmount -e 10.1.1.35
Export list for 10.1.1.35:
/vm          *
/share/yum   *
/share/soft  *
/share/notes *

 

portmap  被用于NFS和NIS协议
 RPC    remote  produrce  call 远程程序调用,端口注册

 

portmap     111  端口       功能端口注册
nfs     2049 端口
其他的rpc.xxx  启动的端口是要向111端口注册的


[root@li ~]# netstat -ntlup |grep 2049
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN      -                  
udp        0      0 0.0.0.0:2049                0.0.0.0:*                               -   

[root@li ~]# netstat -ntlup |grep :111
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      3687/portmap       
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               3687/portmap 


还有下面几个随机端口
[root@dns ~]# netstat -ntlup |grep rpc
tcp        0      0 0.0.0.0:805                 0.0.0.0:*                   LISTEN      3170/rpc.mountd    
tcp        0      0 0.0.0.0:791                 0.0.0.0:*                   LISTEN      3155/rpc.rquotad   
udp        0      0 0.0.0.0:788                 0.0.0.0:*                               3155/rpc.rquotad   
udp        0      0 0.0.0.0:802                 0.0.0.0:*                               3170/rpc.mountd   

 

做nfs服务器  

[root@li ~]# /etc/init.d/portmap start
[root@li ~]# /etc/init.d/nfs start --把这两个服务启起来


配置文件:
 vim /etc/exports

 参数:
 ro    只读
 rw    可读可写 
 root_squash 代表客户端以nfsnobody用户挂载,默认不写就有
 no_root_squash 代表客户端以root用户挂载
 sync 同步
 async 异步


man exports --查看参数帮助


--下面是帮助文档里的例子
       # sample /etc/exports file
       /               master(rw) trusty(rw,no_root_squash)
       /projects       proj*.local.domain(rw)
       /usr            *.local.domain(ro) @trusted(rw)
       /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)home/joe       pc001(rw,all_squash,anonuid=150,ano
       /pub            (ro,insecure,all_squash)

 

主配置文件 
vim /etc/exports

/share/iso  *(ro) --把/share/iso  共享给* (代表所有IP)   ro (代表只读)

/share/iso  *(rw) --rw代表可读可写

/share/iso  10.1.1.0/24(ro)  --只共享给10.1.1的网段的计算机访问
/share/iso  10.1.1.0/255.255.255.0(ro)

/share/iso  10.1.1.218/255.255.255.255(ro)    --定义只10.1.1.218这台计算机可以访问
/share/iso  10.1.1.218/32(ro)

/share/iso  10.1.1.218/32(ro) 10.1.1.254/32(ro)   --定义只有218和254这两台可以访问

 

关于nfs权限:
 客户端挂载目录的权限为服务端共享目录的权限
 

nfs服务共享目录的默认权限规定是以nfsnobody这个用户来挂载
在/etc/passwd下有这么一句
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

 

注意:如果做了服务的话,权限要由服务的权限+系统的权限合起来生效

 也就是说,客户端是否可以访问,需要防火墙允许,服务允许,系统权限允许,才可以访问


/share/iso  *(ro)   默认等于 /share/iso *(ro,root_squash)
 --root_squash代表客户端以nfsnobody用户挂载


/test   *(rw,no_root_squash)
 --表示客户端会以root的身份来挂载服务端的/test目录


/share/iso 10.1.1.218/32(ro,no_root_squash) 10.1.1.254/32(ro,root_squash)
 --no_root_squash代表客户端以root用户挂载,就算是218对/share/iso有w权限,也不能写,因为ro参数确定只读
 

  
/share/iso 10.1.1.218/32(rw,anonuid=533,anongid=534) --指定客户端以uid=533,gid=534挂载


--修改了/etc/exports以后,要重启服务使之生效

 


不用重启服务,使修改过的配置文件生效

exportfs    -arv      --重新读取/etc/exports文件里的共享,并导入
     -auv      --卸载/etc/exports文件里的共享,别人showmount -e看不到,也挂载不了 

 

[root@li iso]# cat /var/lib/nfs/etab
/share/install  *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
/share/soft     *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
/share/iso      *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)


cat /var/lib/nfs/xtab

 

--客户端的操作
 showmount -e 10.1.1.35

 mount 10.1.1.35:/share/iso /mnt


扩展两个命令去了解一下:
showmount -a
nfsstat


练习:
共享/test  ,要求2.2.2.34可以读,可以写,并且写入的属主和属组为root
     2.2.2.0网段对其只读
     其它的不能访问

 

--注意,有时候怎么弄都还是不能挂载,注意一下防火墙的问题
 iptables -F --清除防火墙规则
 service iptables stop
 chkconfig iptables off


 关闭selinux
ls /selinux  --如果有很多系统文件,则说明selinux是开启的

 关闭方法:
 vim /etc/selinux/config

 SELINUX=disabled   --改成disabled

 # reboot    --selinux改完后需要重启系统才生效

 


==================================================================

关于挂载相关的问题:

 1,客户端mount了server端的共享目录,但没有umount,但server先关机,会造成客户端正常关机可能会关不了,或者再umount这个目录也umount不了

 2,把这一句  mount 10.1.1.35:/share/iso/ /mnt  做成开机自动挂载
  第一种方式: vim /etc/fstab
 10.1.1.35:/share/iso   /mnt         nfs    defaults 0 0 
  
  mount -a命令去验证,验证前先把/mnt给umount  
 
 第二种方式:
 vim /etc/rc.local
  mount 10.1.1.35:/share/iso/ /mnt

 

autofs  自动挂载服务


# description: Automounts filesystems on demand


# vim /etc/auto.master
/misc   /etc/auto.misc  --表示/etc/auto.misc这个配置文件里的配置用来自动挂载到/misc目录

# vim /etc/auto.misc
cd              -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom

--光驱被自动挂载到/misc/cd

 

--autofs应该在nfs客户端去配置

vim /etc/auto.master
/nfs    /etc/auto.nfs  --写上这句配置,表示/nfs目录下的挂载选项是由/etc/auto.nfs配置文件决定的  /nfs目录和/etc/auto.nfs文件都是不存在的,自己自定义建立

 

mkdir /nfs


vim /etc/auto.nfs
iso      -      10.1.1.35:/share/iso 
soft     -      10.1.1.35:/share/soft
install  -  10.1.1.35:/share/install
--这三句表示自动把10.1.1.35上的三个共享目录分别挂载到/nfs/iso, /nfs/soft, /nfs/install三个目录下,中间的-表示挂载参数,这里用-是默认挂载


/etc/init.d/autofs restart


--挂载的目录默认在/nfs目录下用ls命令看不到,  但可以 cd /nfs/iso  进去,  这时会帮你自动挂载
大概五分钟后,没有使用的话,会自动umount掉
 


虚拟机上来验证它的默认配置

1,在光驱里加入iso
2,打开虚拟机,启动autofs服务
3,ls /misc/cd   来验证光驱是否被自动挂载到/misc/cd目录 

 

自动挂载USB


[root@li ~]# vim /etc/auto.misc
usb             -fstype=vfat    :/dev/sdb1
--加上上面一句,那么U盘插入电脑后,如果是vfat格式,并且磁盘名为sdb1,就会自动挂载到/misc/usb目录

 


================================================================

 

ssh    (secure shell)
 openssh


sshd服务

[root@li ~]# vim /etc/ssh/sshd_config


man  sshd_config    --查看帮助


/etc/init.d/sshd   --sshd的服务启动脚本

[root@li ~]# netstat -ntlup |grep sshd
tcp        0      0 :::22                       :::*                        LISTEN      2804/sshd

vim /etc/ssh/sshd_config  --配置文件

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak --改配置文件前的好习惯,做一个备份

 

#Port 22    --默认端口是22
#Protocol 2,1   --协议版本现在是2版本
Protocol 2
#AddressFamily any
#ListenAddress 0.0.0.0  --监听的地址范围,默认 是所有
#ListenAddress ::

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key --ssh 等效性,指的是ssh不需要密码

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h  --每隔默认的一小时重新建立一次key
#ServerKeyBits 768    --server key的长度
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH   
SyslogFacility local 7   --日志等级 
#SyslogFacility AUTHPRIV
#LogLevel INFO
# Authentication:

#LoginGraceTime 2m   --宽限时间2分钟
#PermitRootLogin yes  --允许root用户登录
#StrictModes yes
#MaxAuthTries 6


例子一:

修改ssh服务默认端口,增加安全性
#Port 22
Port 222  --修改端口

/etc/init.d/sshd restart --重启服务

[root@li ~]# netstat -ntlup |grep 222 --服务重启之后,看到监听的端口号为222
tcp        0      0 :::222                      :::*                        LISTEN      3088/sshd          


[root@snake ~]# ssh 10.1.1.35 -p 222  --加上-p参数后接端口号
scp -P 222 10.1.1.35:/etc/grub.conf /root --要使用大写p


vim /etc/services  --参考这个文件,有服务与对应的端口,端口不要乱改

端口有关知识:
范围:0-65535
注册端口:0-1024
随机端口:1025~65535  

 

例二:禁用root用户登录
# vim /etc/ssh/sshd_config
PermitRootLogin no --把这个改为no

# /etc/init.d/sshd restart   --重启服务


然后使用ssh来验证,root用户登录不了


例三:

允许空密码ssh登陆
在/etc/ssh/sshd_config里加上

PermitEmptyPasswords  yes --允许空密码登陆
--这个参数可以从man sshd_conf --来查看得到,默认值为no


然后去掉某一个用户在/etc/passwd第二栏的x

再ssh测试


例四:

ssh等效
原理:产生一对密钥,自己持有一个私钥,公钥给对方,需要一对才能解密


 ssh-keygen   --输入这个命令后,三次回车产生空密码key对

[root@li ~]# ssh-keygen
Generating public/private rsa key pair.  --默认是rsa加密方式
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
ad:2d:f9:af:8a:c7:ab:0b:8e:de:47:ed:73:68:f6:b3 root@li.cluster.com


 scp /root/.ssh/id_rsa.pub 10.1.1.104:/root/.ssh/authorized_keys--把公钥传给104的机器后,重命令名为authorized_keys

ssh 10.1.1.104  --直接ssh不需要密码了

 ssh-keygen -t dsa  --可以这样使用dsa的加密方式
 ssh-keygen -t rsa --默认的加密方式

 

练习:三台机的user1用户之间全部ssh不需要密码,并且ssh自己也不需要密码


步骤:三台机都产生空密钥对 --注意是要用user1用户去使用ssh-keygen去产生

 最终,每台机都有/home/user1/.ssh/authorized_keys,并且文件内包括三段信息,这三段信息分别为三台机的id_rsa.pub的内容


a
b
c

 

例五:ssh在服务里配置拒绝普通用户(a和b)登录

--提示man sshd_config   查看denyuser参数的使用方法

 

 


================================================================


 比如要写一个备份的自动运行任务
 要求是:
 1.每年的第一天(1月1号)备份所有数据
 2.每季度的第一天(指的4月,7月,10月这三个月)备份季度内产生的所有数据(如7月1号备份4月到7月产生的数据) 
 3.别的月份的第一天(除1,4,7,10月外)备份每月产生的所有数据(如5月1号则备份4月内产生的数据)
 4,一年内的每个星期天备份这个星期以来的数据(如10月8号为星期天,则备份它这个星期内产生的数据)
 5,除了上面定义的特定天数外(除了每月1号和星期天),每天备份前一天产生的数据

--上面要注意的是:
 
 6.注意时间的重合性,如某月的1号正好是星期天的话,则会重复
 7.要求上面只用写出时间,如何备份不用管,并假设都是每晚凌晨的3点01分做

 

 

不考虑重复时间
01 3 1 1 * 
01 3 1 4,7,10 *
01 3 1 2,3,5,6,8,9,11,12 *
01 3 * * 7
01 3 * * * 

考虑重复时间
01 3 1 1 1-6 
01 3 1 4,7,10 1-6
01 3 1 2,3,5,6,8,9,11,12 1-6
01 3 2-31 * 7
01 3 2-31 * 1-6


思考:如果不是很好表示,是否可以改写一下策略,让它更好表示?
     如果我把第四条换成每月10号和20号分别备份一次,这样的备份策略是否对于crontab更好写了,尝试写一下


01 3 1 1 * 
01 3 1 4,7,10 *
01 3 1 2,3,5,6,8,9,11,12 *
01 3 10,20 * *
01 3 2-9,11-19,21-31 * * 

 

二:配置好自己的autofs服务,自动挂载2.2.2.35:/share/110620这个笔记目录到你的/nfs/notes目录。
    每天下午5点01分自动把所有笔记拷贝到自己的笔记目录
    并将自己的笔记目录使用nfs共享给所有人,但只允许2.2.2.35可以以root身份挂载


vim /etc/auto.master
/nfs /etc/auto.nfs

vim /etc/auto.nfs
notes - 2.2.2.35:/share/110620

 

vim /1.sh

#!/bin/bash

cd /nfs/notes
cp /nfs/notes/*  /notes
 
crontab -e
01  17   *   *   *   sh /1.sh


vim /etc/exports
/notes   2.2.2.35/32(rw,no_root_squash)