本章结构
#查看进程
#控制进程
#at一次性任务设置
#crontab周期性任务设置
程序和进程的关系
#程序
保存在硬盘、光盘等介质中的可执行代码和数据
静态保存的代码
#进程
在cpu及内存中运行的程序代码
动态执行的代码
父、子进程:每个进程可以创建一个或多个进程
查看进程ps
#ps命令
查看静态的进程统计信息
#PS命令—查看静态的进程统计信息
ps命令是Linux系统中最为常用的进程查看工具,主要用于显示高喊挡圈运行的各个进程完整信息的静态快照
a:显示当前终端下所有进程信息,包含其他用户进程,与“x”选项结合时显示系统中所有进程信息
u:使用以用户为主的格式输出进程信息
x:显示当前用户在所有终端下的进程信息
-e:显示系统内的所有进程信息
-l:使用长格式显示进程信息
-f:使用完整的格式显示进程信息
USER:启动该进程的用户账号名称
PID:该进程在系统中的数字ID,在当前系统中是唯一的
TTY:标名该进程在那个==哪个终端上运行,“?”表示不需要终端
STAT:显示了进程当前的状态,如S(休眠)、R(运行)、Z(僵尸)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)、对于僵尸进程要手动关闭。
START:启动该进程的时间
TIME:该进程占用的时间
查看进程信息TOP
#top命令
查看动态的进程排名信息
(还有防止掉线的功能)
查看进程信息pgrep
#pgrep命令
根据特定条件查询今晨PID信息
查看进程信息pstree
#pstree命令
以树形结构列出进程信息
###yum -y install psmisc 安装pstree命令
pstree -aup
-a:显示完整信息
-u:列出对应用户名
-p:列出对应PID号
进程的前后台调度
#Cril+Z组合键
将当前进程挂起,即调入后台并停止执行
#jobs命令
查看处于后台的任务列表
#fg命令 (fg 1)
将后台进程恢复到前台运行,可指定任务序号
终止进程的运行
#Ctri+C组合键
终端正在执行的命令
#kill、killall命令
kill用于终止指定PID号的进程
killall用于终止指定名称的所有进程
-9选项用于强制终止
终止进程的运行
#pkill命令
根据特定条件终止相应的进程
常用命令选项
-U:根据进程所属的用户名终止相应进程
-t:根据进程所在的终端终止相应进程
计划任务管理
#at命令
一次性计划任务
例如:在当天的21:30时自动关闭当前系统
计划任务管理crontab
#crontab命令
按照预先设置的时间周期(分钟、小时、天····)重复执行用户指定的命令操作
属于周期性计划任务
主要设置文件
全局配置文件,位于文件:/etc/crontab
系统默认的设置,位于目录:/etc/cron.*/
用户定义的设置,位于文件:/var/spool/cron/用户名
计划任务管理crontab
#管理crontab计划任务
编辑计划任务:crontab -e 【-u 用户名】
查看计划任务:crontab - l 【-u 用户名】
删除计划任务:crontab -r 【-u 用户名】
###常用的Crontab命令:
安装crontab:yum install crontabs
查看定时任务列表:crontab -l
编辑定时任务:crontab –e【等同于: vim /var/spool/cron/root】
删除定时任务:crontab –r
备份定时任务:crontab -l > $HOME/backMyCrontab
crontab服务操作说明:
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status//查看crontab服务状态
实例:
每隔2分钟输出当前时间到文件
*/2 * * * * echo $(date) >> /test/date.log
在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup
0 6-12/3 * 12 * /usr/bin/backup
每天3-5,17-20每隔30分钟同步一次互联网时间,并且不输出日志到crontab将结果输出到log
echo “*/30 [3-5],[17-20] * * * /usr/bin/ntpstat time.windows.com >/dev/null 2>&1” >> /var/cron.log
每隔两天的上午8点到11点的第3和第15分钟执行command
3,15 8-11 */2 * * command
每个星期一的上午8点到11点的第3和第15分钟执行command
3,15 8-11 * * 1 command
每周六、周日的1:10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
00 03 * * 1-5 find /home “*.xxx” -mtime +4 -exec rm {} ;
每小时执行/etc/cron.hourly目录内的脚本
01 * * * * root run-parts /etc/cron.hourly
Crontab使用小结:
1.环境变量问题,例如crontab不能识别Java的环境变量
crontab执行shell时,只能识别为数不多的环境变量,普通的环境变量是无法识别的,所以在编写shell时,最好使用export重新声明变量,确保脚本执行。
2.命令的执行最好用脚本
3.脚本权限加/bin/sh,规范路径/server/scripts
4.时间变量用反斜线转义,最好用脚本
5.定时任务添加注释
6.>/dev/null 2>&1 ==>&>/dev/null,别随意打印日志文件
7.定时任务里面的程序脚本尽量用全路径
8.避免不必要的程序以及命令输出
9.定时任务之前添加注释
10.打包到文件目录的上一级
知识拓展:
查看crontab的日志记录:
或者是 less /var/log/cron 输入G(大写),直接到末尾查看最新的日志信息。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/
第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件如下:
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
使用注意事项:
注意环境变量问题
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。
在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
注意清理系统用户的邮件日志(命令:rm -f /val/mail/root )
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。
例如,可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。
其他注意事项
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。