Linux的进程管理与监控和任务工具crontab的使用
一、Linux的进程简介与监控
1.1、Linux的进程简介
进程的的基本定义是指【在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程】。 | |
Linux进程的分类 | |
系统进程 | 可执行内存资源分配和进程切换等管理工作;且该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。 |
用户进程 | 用户进程是指【通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭】。 《1》交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。 《2》批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。 《3》守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。例如httpd进程,一直处于运行状态,等待用户的访问。(如经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务)。 |
1.2、Linux进程的监控与管理
在Linux系统中,进程ID(用PID表示)是区分不同进程的唯一标识,它们的大小是有限制的,最大ID为32768,用UID和GID分别表示启动这个进程的用户和用户组。所有的进程都是PID为1的init进程(Centos7.x版本是systemd进程)的后代。内核在系统启动的最后阶段启动init进程,因此这个PID为1的init进程是Linux下所有进程的父进程,用PPID表示父进程。
序号 | 进程管理的常用命令 | 说明 | ||||||||||||||||||||||||||||||
1 | ps | ps命令允许你显示正在运行的进程信息(会生成一个执行命令时正在运行的快照静态列表) | ||||||||||||||||||||||||||||||
2 | top | top可以实时显示Linux正在运行的进程信息 (还可以设置top命令实时显示正在运行进程的内容,按下[f]键进入设置模式,使用山下箭头移动光标,按下【space 空格】键表示使用该内容,按下【q】表示保存设置并退出) | ||||||||||||||||||||||||||||||
3 | lsof | lsof(List Open Files)命令可列出哪些进程打开了哪些文件
一、FD(文件描述符)是用来访问文件或输入输出资源的抽象标识,有如下八种表现形式: 《1》数字(如:0【表示标准输入STDIN】、1【表示标准输出STDOUT】、2【表示标准错误输出STDERR】); 《2》cwd:表示当前工作目录; 《3》rtd:表示根目录; 《4》txt:表示程序代码; 《5》mem:表示内存映射文件; 《6》数字w:(如:6w)表示文件是以写入模式打开的; 《7》数字u:(如:6u)表示文件是以读写模式打开的; 《8》数字r:(如:6r)表示文件是以读模式打开的; 二、TYPE(文件类型)是有关打开文件的类型,可能包括但不限于如下八种类型: 《1》REG:表示常规文件(即:普通数据文件); 《2》DIR:表示目录; 《3》CHR:表示字符设备文件(如:终端、打印机等); 《4》BLK:表示块设备文件(如:硬盘、光驱等); 《5》FIFO:表示命名管道(用于进程间通信); 《6》SOCK:表示Socket文件(用于网络通信); 《7》IPV4\IPV6:表示IPV4或IPV6网络文件; 《8》unix:表示unix域或Socket文件; 三、特殊文件,一般包含如下三种: 《1》设备文件:若是字符块设备或文件则最后的NAME列会显示设备文件的路径(如:/dev/tty(终端设备)或/dev/sdb1(硬盘分区)); 《2》命名管道:通常显示为pipe:[inode]([inode]是管道文件的inode编号); 《3》Socket文件:连接显示本地地址及其端口号(格式如:[local address]:[local port]->[remote address]:[remote port]) | ||||||||||||||||||||||||||||||
4 | pgrep | pgrep(process global regular expression print)其功能是用于检索程序进程PID编号;它是通过正则表达式进行检索的,因此用户只需要输入服务名称中的一部分即可进行搜索,对于不记得全名的服务程序十分有用。 | ||||||||||||||||||||||||||||||
5 | kill | kill命令的功能是杀死或结束进程。 kill命令的语法是 kill [信号类型] 进程PID 信号类型有很多种,可以通过【kill –l】查看所有信号类型。常用的信号类型有SIGKILL,对应的数字为9,还有SIGTERM和SIGINT,对应的数字分别为15和2。 注意:这里使用kill命令杀死进程的时候需要杀父进程(一般杀死编号最小的那个,且编号都是连续的)才有用,杀子进程后程序一般会另起一个对应的子进程(会导致子进程的编号不连续)【查看子进程编号不连续也可以大致判断出这个程序的子进程出过问题】。 | ||||||||||||||||||||||||||||||
6 | killall | killall也是杀死或结束进程的命令(与kill不同的是,killall后面跟的是进程的名字,而不是进程的PID,因而,killall可以终止一组进程)。 killall的语法是 killall [信号类型] 进程名称 《1》信号类型:与kill命令中信号类型的含义相同。 | ||||||||||||||||||||||||||||||
命令执行后,可以使用【echo $?】来查看刚刚执行的命令是否执行成功,若命令执行成功则显示0;否则就是执行失败 |
二、任务调度进程crond的简介与使用
2.1、任务调度进程crond简介
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似。 Linux下的任务调度分为【系统任务调度】和用【户任务调度】。 | ||
1 | 系统任务调度 | 系统任务调度的配置文件是【/etc/crontab】。 系统周期性所要执行的工作(如:写缓冲数据到硬盘、日志清理等周期性操作)。 |
2 | 用户任务调度 | 用户自定义的调度任务文件都在【/var/spool/cron/】目录中,其文件名与用户名一致。 用户定期要执行的工作(如:用户数据备份、定时邮件提醒等周期性操作),用户可以使用 crontab 工具来定制自己的计划任务。 |
|
2.2、自定义计划任务工具crontab使用
crontab常用的使用格式: crontab [-u user] [file] | ||
序号 | 常用选项 | 说明 |
1 | -u user | 用来设定某个用户的crontab服务(“-u coffeemilk”表示设定coffeemilk用户的crontab服务,此参数一般由root用户来运行) |
2 | file | file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。 |
3 | -e | 编辑某个用户的crontab文件内容。 注意:若不指定用户,则表示编辑当前用户的crontab文件。 |
4 | -l | 显示某个用户的crontab文件内容。 注意:若不指定用户,则表示显示当前用户的crontab文件内容。 |
5 | -r | 从/var/spool/cron目录中删除某个用户的crontab文件。 注意:若不指定用户,则默认删除当前用户的crontab文件。 |
6 | -i | 在删除用户的crontab文件时给确认提示 |
常用组合: 《2》crontab -l |
#注意:如下命令生成的定时调度任务文件是存在【/var/spool/cron/】路径下,每个用户对应生成自己用户名称的文件(如:root用户的定时调度文件路径是【/var/spool/cron/root】)
#1-新增或编辑当前用户下的定时调度任务命令
crontab -e#2-查看当前用户下的定时调度任务命令
crontab -l#3-新增或编辑指定用户下的定时调度任务命令(crontab -r 用户名称 -e)
crontab -r coffeemilk -e#4-查看指定用户下的定时调度任务命令(crontab -r 用户名称 -l)
crontab -u coffeemilk -l#5-查看定时调度任务的执行日志(查看最新10条日志数据)
tail -f /var/log/cron
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段。crontab文件每行的格式如下: minute hour day month week command | ||
序号 | crontab格式 | 说明 |
1 | minute | 分钟,可以是从0到59之间的任何整数。 |
2 | hour | 小时,可以是从0到23之间的任何整数。 |
3 | day | 日期,可以是从1到31之间的任何整数。 |
4 | month | 月份,可以是从1到12之间的任何整数。 |
5 | week | 星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。 |
6 | command | 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。 |
在以上各个字段中,还可以使用以下特殊字符: 《1》星号(*):代表所有可能的值(如:month字段若是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作)。 |
#crontab文件定时调度任务的示例#1-每隔3个小时重启apache服务一次
0 */3 * * * /usr/local/apache2/apachectl restart#2-每周六的3点30分执行/webdata/bin/backup.sh脚本的操作
30 3 * * 6 /webdata/bin/backup.sh#3-每个月的1号和20号的0点0分检查/dev/sdb8磁盘设备
0 0 1,20 * * fsck /dev/sdb8#4-每个月每隔5天(5号、10号、15号、20号、25号、30号)的5点10分执行清理apache日志操作
10 5 */5 * * echo "">/usr/local/apache2/log/access_log
#crontab文件中的定时调度时间常用设置示例
* * * * * 每分钟运行一次 cron 任务。
0 * * * * 每小时运行一次 cron 任务。
0 0 * * * 每天0点0分运行 cron 任务。
0 2 * * * 每天凌晨 2 点运行 cron 任务。
0 0 15 * * 每个月 15 日0点0分运行一次 cron 任务。
0 0 * * 6 每周六0点0分运行 cron 任务。
0 15 * * 1-5 每周一到周五每天下午 3 点运行 cron 任务。
*/5 * * * * 每 5 分钟运行一次 cron 任务。
0 8-16 * * * 每天从上午 8 点到下午 4 点准时执行 cron 任务。
0 6 * * 2,4 每周二和周四凌晨 6 点运行 cron 任务。
2.3、任务调度工具crontab的注意事项
序号 | 注意事项 | 说明 |
1 | 环境变量问题 | 有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。 解决方法:(在我们需要定时调度的任务配置环境) |
2 | 清理系统用户的邮件日志 | 用户的邮件日志是在【/var/mail】目录下,对应用户名称的文件中。 若命令不在shell终端的前台显示输出信息,而是在后台运行,那么该命令运行的信息会输出到【/var/mail】目录下,对应用户名称的文件中,若不清理则该日志文件会越来越大: 可以在crontab文件中设置如下形式,忽略日志输出: |
3 | 【系统级任务调度】 与【用户级任务调度】 | 系统级任务调度主要完成系统的一些维护操作(如:定时重启机器); 用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行。 |
三、其他资料
Linux系统必学的基础操作命令——快速上手Linux(上)-CSDN博客https://coffeemilk.blog.csdn.net/article/details/148987685第 24 章 自动执行系统任务 | 系统管理员指南 | Red Hat Enterprise Linux | 7 | Red Hat Documentation
https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-automating_system_taskscron(8) - Linux 手册页
https://www.man7.org/linux/man-pages/man8/cron.8.html