大家好,这次来跟大家分享一下Linux进程和任务计划

程序是保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合,而进程是在CPU及内存中处于动态执行状态的计算机程序。在Linux操作系统中,每个程序启动后可以创建一个或多个进程。例如,提供Web服务的httpd程序,当有大量用户同时访问Web页面时,httpd程序可能会创建多个进程来提供服务。

这里简要介绍了一下程序和进程的区别。

ps命令——查看静态的进程统计信息(Processes Statistic)

a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显示系统中所有的进程信息。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程信息。  -e:显示系统内的所有进程信息。
-l:使用长(Long)格式显示进程信息。  -f:使用完整的(Full)格式显示进程信息。
这就是ps命令常用的一些选项,常用的是
ps aux
![在这里插入图片描述](https://img-blog.csdnimg.cn/513a99701405440898310b210b54bd95.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2VpeGluXzQ3NTU2NjAx,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)
上述输出信息中,第一行为列表标题,其中各字段的含义描述如下。  USER:启动该进程的用户账号的名称。
PID:该进程在系统中的数字ID号,在当前系统中是唯一的。
%CPU:CPU占用的百分比。
%MEM:内存占用的百分比。
VSZ:占用虚拟内存(swap空间)的大小。
RSS:占用常驻内存(物理内存)的大小。
TTY:表明该进程在哪个终端上运行。“?”表示未知或不需要终端。 STAT:显示进程当前的状态,如S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)。对处于僵死状态的进程应该予以手动终止。
START:启动该进程的时间。 TIME:该进程占用的CPU时间。 COMMAND:启动该进程的命令的名称。 若执行如下的“ps -elf”命令,则将以长格式显示系统中的进程信息,并且包含更丰富的内容。例如,输出信息中还包括PPID列(表示对应进程的父进程的PID号)


[root@localhost ~]# ps -elf
![在这里插入图片描述](https://img-blog.csdnimg.cn/4ee8284f0ff44ec7a5900f79554c71bc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2VpeGluXzQ3NTU2NjAx,size_20,color_FFFFFF,t_70,g_se,x_16)
直接执行不带任何选项的ps命令时,将只显示当前用户会话中打开的进程,具体操作如下:

[root@localhost ~]# ps
PID TTY TIME CMD 3728 pts/1 00:00:00 bash 4976 pts/1 00:00:00 ps


由于系统中运行的进程数量较多,需要查询某一个进程的信息时可以结合管道操作和grep命令进行过滤。例如,执行以下操作可以过滤出包含“bash”的进程信息。

 

[root@localhost ~]# ps aux | grep bash
root 806 0.0 0.0 115248 936 ? S 08:27 0:00 /bin/bash /usr/ sbin/ksmtuned root 3115 0.0 0.0 52864 568 ? Ss 08:28 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnomesession --session gnome-classic" root 3675 0.0 0.1 116536 3240 pts/0 Ss 08:34 0:00 bash root 5034 0.0 0.0 112652 960 pts/0 S+ 09:23 0:00 grep --color=au to bash


top命令——查看进程动态信息 (这个信息是实时更新的)
[root@localhost ~]# top
![在这里插入图片描述](https://img-blog.csdnimg.cn/54e0c3d3614e4e7a8dde8592b7a18d61.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2VpeGluXzQ3NTU2NjAx,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center)
上述输出信息中,开头的部分显示了系统任务(Tasks)、CPU占用、内存占用(Mem)、交换空间(Swap)等汇总信息,汇总信息下方依次显示当前进程的排名情况。相关信息的含义表述如下。  系统任务(Tasks)信息:total,总进程数;running,正在运行的进程数;sleeping,休眠的进程数;stopped,中止的进程数;zombie,僵死无响应的进程数。 CPU占用信息:us,用户占用;sy,内核占用;ni,优先级调度占用;id,空闲CPU;wa,I/O等待占用;hi,硬件中断占用;si,软件中断占用;st,虚拟化占用。要了解空闲的CPU百分比,主要看%id部分。 内存占用(Mem)信息:total,总内存空间;free,空闲内存;used,已用内存;buff/cache,物理内存和交换内存的缓冲区总和。

pgrep命令——查询进程信息
[root@localhost ~]# pgrep -l "log"
431 xfs-log/dm-0 636 xfs-log/sda1 637 xfs-log/sdb1 661 xfs-log/dm-2 713 abrt-watch-log 730 abrt-watch-log 799 systemd-logind 1135 rsyslogd

[root@localhost ~]# pgrep -l -U teacher -t tty2
6098 bash 6144 vim
pstree命令——查看进程树

[root@localhost ~]# pstree -aup systemd,1 --switched-root --system --deserialize2 „„// 省略部分信息 ├─login,6029 │ └─bash,6098,teacher │ └─vim,6144 myfile.txt „„// 省略部分信息

[root@localhost ~]# pstree -ap teacher bash,6248 bash,6098 └─vim,6144 myfile.txt

 

[root@localhost ~]# cp /dev/cdrom mycd.iso & [1] 6426 //输出信息中包括后台任务序号、PID号

[root@localhost ~]# wget ftp://173.17.17.13/firefox-3.6.13.tar.bz2 --12:55:24-- ftp://173.17.17.13/firefox-3.6.13.tar.bz2 => 'firefox-3.6.13.tar.bz2.1' Connecting to 173.17.17.13:21„ 已连接. 正在以 anonymous 登录 „ 登录成功! ==> SYST „ 完成. ==> PWD „ 完成. ==> TYPE I „ 完成. ==> 不需要 CWD. ==> SIZE firefox-3.6.13.tar.bz2 „ 9437184 ==> PASV „ 完成. ==> RETR firefox-3.6.13.tar.bz2 „ 完成. 长度:9437184 (9.0M) 0% [ ]0 --.- k/s //按Ctrl+Z组合键 [1]+ Stopped wget ftp://173.17.17.13/firefox-3.6.13.tar.bz2

 

[root@localhost ~]# jobs -l [1]+ 28584 停止 wget ftp://173.17.17.13/firefox-3.6.13.tar.bz2

 

[root@localhost ~]# fg 1 wget ftp://173.17.17.13/firefox-3.6.13.tar.bz2 „„ //省略部分信息


[root@localhost ~]# pgrep -l "sshd" //查询目标进程的PID号 5822 sshd [root@localhost ~]# kill 5822 //终止指定PID的进程 [root@localhost ~]# pgrep -l "sshd" //确认进程已终止(查询时无结果)

 

[root@localhost ~]# vim tmpfile //打开vim程序并挂起作为测试 [1]+ Stopped vim tmpfile [root@localhost ~]# jobs –l //查询目标进程的PID号 [1]+ 7095 Stopped vim tmpfile [root@localhost ~]# kill 7095 //尝试正常结束进程 [root@localhost ~]# jobs -l //但发现vim进程并未退出 [1]+ 7095 Stopped vim tmpfile [root@localhost ~]# kill -9 7095 //强制终止目标进程 [root@localhost ~]# jobs -l //成功终止vim进程 [1]+ 2993 已杀死 vim tmpfile 2)使用killall命令终止进程 使用killall命令可以通过进程名称来终止进程,当需要结束系统中多个相同名称的进程时,使用killall命令将更加方便,效率更高。killall命令同样也有“-9”选项。例如,执行如下的“killall -9 vim”命令可将所有名为vim的进程都强行终止。 [root@localhost ~]# vim testfile1 //挂起第1个vim测试进程 [1]+ Stopped vim testfile1 [root@localhost ~]# vim testfile2 //挂起第2个vim测试进程 [2]+ Stopped vim testfile2 [root@localhost ~]# jobs -l //确认待终止的进程信息 [1]- 7144 Stopped vim testfile1 [2]+ 7153 Stopped vim testfile2 [root@localhost ~]# killall -9 vim //通过进程名终止多个进程 [root@localhost ~]# jobs -l [1]- 7144 Killed vim testfile1 [2]+ 7153 Killed vim testfile2 3)使用pkill命令终止进程 使用pkill命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与pgrep命令基本类似,如“-U”(指定用户)、“-t”(指定终端)等选项,使用起来非常方便。例如,若要终止由用户hackli启动的进程(包括登录Shell), 第 12 页 共 18 页 可以执行以下操作。 [root@localhost ~]# pgrep –l -U "hackli" //确认目标进程相关信息 3773 bash [root@localhost ~]# pkill -9 -U "hackli" //强行终止用户hackli的进程 [root@localhost ~]# pgrep -l -U "hackli" //确认目标进程已被终止


[root@localhost ~]# date Sun May 7 10:33:13 EDT 2017 [root@localhost ~]# at 10:35 2017-05-07 at> pgrep -U root | wc -l > /tmp/ps.root at> <EOT> //任务设置完毕后按Ctrl+D组合键提交 job 1 at Sun May 7 10:35:00 2017 [root@localhost ~]# cat /tmp/ps.root //等过了计划时间后验证命令结果 202

 

[root@localhost ~]# at 21:30 at> shutdown -h now at> <EOT> job 2 at Sun May 7 21:30:00 2017

 

[root@localhost ~]# atq
2 Sun May 7 21:30:00 2017 a root

 


[root@localhost ~]# atrm 2 //删除第2条at计划任务
[root@localhost ~]# atq //确认第2条任务已被删除

 


[root@localhost ~]# cat /etc/crontab SHELL=/bin/bash //设置执行计划任务的Shell环境 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

 

[root@localhost ~]# ls -l /var/spool/cron/*
-rw-------. 1 root root 33 May 7 11:01 /var/spool/cron/root

 

使用crontab命令管理用户的计划任务 设置用户的周期性计划任务列表主要通过crontab命令进行,结合不同的选项可以完成不同的计划任务管理操作。常用的选项如下。
-e:编辑计划任务列表。
-u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己),一般只有root用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。
-l:列表显示计划任务。
-r:删除计划任务列表。

 

01 * * * * /root/run_hourly_cmd 02 4 * * * /root/run_daily_cmd 22 4 * * 0 /root/run_weekly_cmd 42 4 1 * * /root/run_monthly_cmd 50 3 2 1 * /root/run_yearly_cmd

每一行任务配置记录都包括六个数据字段,分别表示不同的含义

![在这里插入图片描述](https://img-blog.csdnimg.cn/a788aae8fd1e441c860e526c81917e16.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2VpeGluXzQ3NTU2NjAx,size_20,color_FFFFFF,t_30,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/57c5f66bbabf48b2973e9b53056fc48d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_20,text_Q1NETiBAd2VpeGluXzQ3NTU2NjAx,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
除了“*”以外,还可以使用“-”(减号)、“,”(逗号)、“/”(斜杠)与数字构成表达式来表示较复杂的时间关系。  减号“-”:可以表示一个连续的时间范围,如“1-4”表示整数1、2、3、4。  逗号“,”:可以表示一个间隔的不连续范围,如“3, 4, 6, 8”。 斜杠符号“/”:可以用来指定间隔频率,如在日期字段中的“*/3”表示每隔3天。 例如,若要按固定的周期重复完成一些系统管理任务,任务内容如下:①每天早上7:50自动开启sshd服务,22:50关闭sshd服务;②每隔五天清空一次FTP服务器公共目录/var/ftp/pub中的数据;③每周六的7:30重新启动系统中的httpd服务;④每周一、周三、 第 17 页 共 18 页 周五的下午17:30,使用tar命令自动备份/etc/httpd目录,则可由root用户通过crontab设置以下计划任务。 [root@localhost ~]# crontab -e 50 7 * * * /usr/bin/systemctl start sshd.service 50 22 * * * /usr/bin/systemctl stop sshd.servic 0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/* 30 7 * * 6 /usr/bin/systemctl httpd restart 30 17 * * 1,3,5 /usr/bin/tar jcf httpdconf.tar.bz2 /etc/httpd/ 普通用户执行“crontab -e”命令时,可以设置自己的计划任务(需要注意命令的执行权限)。例如,用户jerry设置一条计划任务:在每周日晚上的23:55将/etc/passwd文件的内容复制到宿主目录中,保存为pwd.txt文件,具体操作如下: [jerry @localhost ~]# crontab -e 55 23 * * 7 /usr/bin/cp /etc/passwd /home/jerry/pwd.txt 因各条计划任务在执行时并不需要用户登录,所以任务配置记录中的命令建议使用绝对路径,以避免因缺少执行路径而无法执行命令的情况。另外,在设置非每分都执行的任务时,“分钟”字段也应该填写一个具体的时间数值,而不要保留为默认的“*”,否则将会在每分钟执行一次计划任务。 2)查看用户的计划任务列表 crontab命令结合“-l”选项可以查看当前用户的计划任务列表,对于root用户来说,还可以结合“-u”选项查看其他用户的计划任务,具体操作如下: [root@localhost ~]# crontab –l //查看用户root自己的计划任务 50 7 * * * /usr/bin/systemctl start sshd.service 50 22 * * * /usr/bin/systemctl stop sshd.servic 0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/* 30 7 * * 6 /usr/bin/systemctl httpd restart 30 17 * * 1,3,5 /usr/bin/tar jcf httpdconf.tar.bz2 /etc/httpd/