(续前)
(七)自动执行作业
1、作业控制
暂停正在运行的进程或作业: ^Z
使暂停任务继续在后台运行: bg命令
使暂停任务或后台进程转前台运行: fg命令
查看暂停或后台作业: jobs命令(可得到作业号)
用户退出系统后还不会结束运行: nohug
用户一旦退出系统,nohug启动的作业无法在jobs命令显示中更新。
#kill %作业号 (终止指定作业号的进程)
#fg %作业号
#bg %作业号
#nohug Command [Arg...][&] (加&时则在后台运行)
输出都会被写到当前目录下的nohug.out文件中,在没有写权限时,重定向到$HOME/nohug.out文件。
eg. $nohug find /-name myprg -print &
2、at命令
从标准输入或脚本文件中读取命令,并在指定时间执行。
一般地,at执行后会把标准输出和错误输出以email形式发送给用户,除非用户作了重定向。
at只在预定时间运行一次,如果未开机则无法执行。但用户是否退出系统则不影响at命令的执行。
at [-c | -k | -s | -q Queue][-m][-f File]{-t Date | Time [Day] [Increment]}
-c 用csh来执行,相当于-q f
-k 用ksh来执行,相当于-q e
-s 用bsh
-q Queue 将作业放入指定队列,默认情况下预定作业放在a队列中,而b,c,d是
保留的队列名。(b是batch作业,命令从标准输入读入,Time参数由
now关键字指定;c是cron作业,d是sync作业)
-m 邮件发送
-f File 文件代替标准输入
-t Date ... 指定运行时间。
其中,Day是星期几,如Sunday;
也可以是月份全称,如December.
可用管道符将命令Command告诉给at命令在Time时间执行。
eg. $echo Command | at Time(Time为指定时间)
还可用ls命令查看所有at作业:
#cd /var/spool/cron/atjobs
#ls -l
[实质:at命令发出后,即给在at命令中指定的程序或命令分配一个作业号,并在此目录中进行排队,所以可用ls -l查看到]
-t 后面的参数中:
Date 格式:
[[cc]YY]MMDDhhmm[.SS]
19 83 03180958 .25
20 05 11261709 .33
年份 月日时分 秒
Time 格式:
am(上午,A也可)
pm(下午,P也可)
zulu(格林威治时间)
也可以:noon(N),midnight(M),now(现在)
$at now next week 下周的现在
$at now +38 days 38天后的现在
$at noon tomorrow
$at 3:00 pm Friday next work
用at命令显示当前系统中已建立的预定作业:
$at -l [-o] [Job ... | -q Queue]
| | ------- --------
| | | |
| | 作业号 作业队列名
| |
| +-- 按时间顺序显示
+-- 显示已建立作业
$at -n [User]
eg. #at -n johnson 显示johnson在用户队列中的文件数
$at -r [-F] [-i] [Job ... | -u User]
-r 删除已存在的作业
-F 禁止删除校验
-i 交互方式
Job ... 作业号
-u User 删除指定用户的所有作业(仅root用户可用)
#atrm 作业号 (相当于:#at -r 作业号,作用都是删除由at建立的作业)
凡由at命令建立的作业都由cron服务进程在预定的时间执行。
#atq [-c | -n] [User ...] (显示等待执行的作业队列)
-c 时间排序
-n 只显示作业号
以下两个文件共同控制用户使用at和batch命令的权限:
/var/adm/cron/at.allow (允许)
/var/adm/cron/at.deny (禁止)
只有root用户可修改、删除、创建上两个文件。
batch命令解决系统负载瓶颈对预定作业的影响。
batch实际上是调用at -b -m now命令,其一般格式与at相同。
周期性地自动执行命令(cron进程:自动在定时执行或周期性执行作业)
cron进程由init进程启动,只需启动一次,直至系统关闭。
由cron进程完成的事件(定义在/var/adm/cron/queuedefs文件):
(1)crontab命令
(2)at
(3)batch
(4)sync(系统同步事件,同步写磁盘操作)
(5)ksh或csh
检查cron进程是否正常运行:
#crontab -e 编辑crontab文件添加以下记录:
***** /bin/date,然后检查用户信箱
检查:#ps -ef |grep cron 查看cron进程是否运行,如没有运行,检查文件/etc/inittab中是否有下面一行记录。
cron:23456789:respawn:/usr/sbin/cron
如无,用smitab命令或vi添加上行记录;
然后,再执行一次:#telinit -q (让init进程重启cron进程)
再用ps命令检查它是否正常运行。
查看哪些用户已建立cron作业:
#cd /var/spool/cron/crontabs
[实质:cron机制为每个用户建立一个crontab文件,以用户名为文件名,并放在此目录下]
#ls -l
skulker命令:删除过时,不再需要的文件,主要是/tmp目录下的文件,在指定时间之前的文件,a.out文件、core文件或ed.hup文件。(只由root用户运行)
skulker可与find,xargs命令组合使用,以查找指定条件的文件。(请谨慎使用该命令!)
/usr/lib/smdemon.cleanu >/dev/null
脚本文件:用于清理sendmail命令的队列和维护/var/spool/mqueue/log文件。
crontab文件记录的格式:
minute hour day_of_month month weekday command
0~59 0~23 1~31每月第几天 1~12 0~6(0为星期日) Shell命令或脚本
(1)从...到....:数字用“-”连接,表范围,如1-5表示1,2,3,4,5。
(2)单独数字表示所属时间内,如Month中填6,表示6月内;
(3)逗号分隔,表示单列项,如1,3,5
(4)*号表所有合法值,如:*放在month表示1~12
举例:0 0 1,20 * 5 ...
表示每月1日,20日和每周5执行...
如该字符串包含%(除\%外),则%之前为命令,之后为标准输入部分。
如johnson在每个周末下午5:50向所有用户祝周末愉快,则在/var/spool/cron/crontabs目录下建一个johnson的文件,则johnson用户的crontab文件就是:/var/spool/cron/crontabs/johnson,在此文件中添加如下记录:
0 16 * * 5 /usr/sbin/wall %HAPPY WEEKEND!
添加和修改cron作业
对crontab文件进行编辑:(1)vi命令手工编辑(2)使用crontab工具
#crontab [-e | -l | -r | -v | File]
-e 编辑当前用户的crontab文件,如不存在,则启动编辑佳话来创建之。
-l 显示用户的crontab文件内容
-r 从crontabs目录中删除用户的crontab文件
-v 显示用户cron作业提交的时间
使用crontab命令两种方式:
(1)手工方式:手工创建文本文件如:TempCronjobs,它包括cron进程所需要的内容,则:
$crontab TempCronjobs
该命令首先对TempCronjobs的内容进行合法性检查,如有效,则copy到/var/admn/cron/crontabs目录中,并以用户名为文件名或覆盖当前用户原来的crontab文件。
(2)使用crontab -e,它会自动建立或修改以当前用户名为文件名的crontab文件。
如果当前用户的crontab不存在,则它会在/var/admn/cron/crontabs目录中创建它;
如已存在,则先COPY原crontab文件的一个副本到/tmp目录下,再对该副本进行编辑,编辑完成后,检查该副本内容的有效性,再用副本覆盖原文件。
显示crontab文件的内容:
$crontab -l
删除一个cron作业,用crontab -e删除crontab文件中包含要删除作业的那一行。(也可以用vi修改)
[注意:避免root用户使用crontab -r命令,它会删除/var/spool/cron/crontabs/root文件,此文件包含诊断硬件错误和检查系统故障等的日常性定时作业。一旦删除,会对系统安全构成威胁。此时,只能通过以前的备份来恢复它]
禁止或允许使用某些用户使用crontab或at命令:
在/usr/adm/cron目录下建立cron.allow, cron.deny, at.allow, at.deny文件。
cron.allow和cron.deny都不存在,则只有root用户可用crontab命令。如相关文件存在,则存在优先原则;*.allow优先于*.deny。
/var/adm/cron/log文件中记录cron进程的所有活动日志。应该定时清理此cron日志文件,以免它太大,占用空间。
Chapter 18 网络文件系统NFS
NFS:Network File System 网络文件系统,Sun Microsystems公司1984年开发,是事实上的工业标准,UNIX系列,WINDOWS系列均支持。
NFS是一个分布式文件系统,它允许用户访问远程系统上的文件和目录,对用户而言犹如本地。用户可在本地使用操作系统命令创建、删除、读写远程文件和目录,设置相关属性。通过使用RPC(远程过程调用)而不受机器类型、操作系统和网络结构的限制。
NFS基于客户机/服务器模式。客户机在访问服务器导出的文件系统之前,必须先在本地安装(Mount)这个文件系统。
远程资源通常写作:hostname:pathname格式;hostname为NFS服务器的主机名,pathname为服务器上被导出目录的绝对路径。
安装点(Mount Point):在客户机上安装远程资源的那个目录。
NFS的具体协议是RPC(远程过程调用)协议与XDR(外部数据表示)协议。RPC是通过UDP和TCP在网络中传送数据报,所以NFS也依赖于TCP/IP。。RPC和XDR是一套基于TCP/IP的应用程序编程接口。
NFS协议是无状态的。portmap守候进程的主要功能是把RPC程序号转化为Internet的端口号。它由/etc/rc.tcpip命令文件启动,而标准的RPC进程通常由inetd进程启动。
启动NFS服务:#mknfs [-I | -N | -B]
[启动条件]/etc/exports文件必须存在,否则nfsd和rpc.mountd进程不会启动。
如不存在,使用:#touch /ect/exports创建一个空的/etc/exports文件,再启动NFS服务。
#mknfs -N (-N 立即执行/etc/rc.nfs命令文件)
在系统启动时即运行/etc/rc.nfs命令文件,则需要在/etc/inittab文件中添加一条启动NFS服务的记录:
#mknfs -I (-I 添加一条记录至/etc/inittab文件中)
需要添加自动启动记录并立即执行,则:
#mknfs -B (这是mknfs的默认参数)
startsrc也可启动NFS进程,NFS进程也可单独启动。
如:#startsrc -s rps.mountd (启动rpc.mountd进程)
要启动NFS的所有进程,可以:#startsrc -g nfs
关闭NFS服务:#rmnfs [-I | -N | -B] (参数意义相似,整体作用与mknfs相反)
查看NFS进程是否在运行:#lssrc -g nfs