Linux/Centos7系统管理之进程与计划任务管理
Linux/Centos7系统管理之进程与计划任务管理
- 查看进程--静态和动态查看
- 控制进程--条件和全部
- at 一次性任务设置
- crontab 周期性任务设置
一、程序和进程的关系
(1)概念
程序:保存在硬盘、光盘等介质中的可执行代码和数据,属于静态保存的代码
进程:在CPU及内存中运行的程序代码,属于动态执行的代码
(2)如何理解应用程序、进程及线程的概念和联系
- 应用程序--工厂
- 进程--车间
- 线程--工人
一个应用程序可以包含一个或多个进程,一个进程包含一个或多个线程,线程是执行操作的最小单元
ps:对应高并发处理===使用多线程操作
二、进程相关命令
(1)查看进程信息ps
ps 命令--不是Photoshop哈!
man 手册对其作用的描述是这样的:"displays information about a selection of the active processes. If you want a repetitive update of the selection and the displayed information, use top(1) instead."
其意思为:显示有关活动进程的选择的信息。如果希望对选择和显示的信息进行重复更新,请使用top(这里的top也是查看进程的信息的,但是是动态查看,下面会具体讲述)
(2)ps命令的格式
ps [选项] [参数]
在man 手册上给出的案例我节选部分常用的出来进行演示和讲述:
-aux :"-"可以省略,表示查看系统中使用BSD语法规则的每个进程
-elf:表示查看系统中使用标准语法的每个进程,不能省略"-"
实例如下:
[root@lokott ~]# ps aux //ps -aux也一样USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.4 210140 4864 ? Ss 14:23 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21root 2 0.0 0.0 0 0 ? S 14:23 0:00 [kthreadd]root 3 0.0 0.0 0 0 ? S 14:23 0:00 [ksoftirqd/0]root 5 0.0 0.0 0 0 ? S< 14:23 0:00 [kworker/0:0H]root 6 0.0 0.0 0 0 ? S 14:23 0:00 [kworker/u256:0]root 7 0.0 0.0 0 0 ? S 14:23 0:00 [migration/0]root 8 0.0 0.0 0 0 ? S 14:23 0:00 [rcu_bh]root 9 0.0 0.0 0 0 ? R 14:23 0:00 [rcu_sched]...
解释:PID表示进程ID,%CPU表示CPU使用率,%MEM表示内存使用率,TTY表示终端,STAT表示的是状态:S 是sleep可中断,s表示父进程,<表示的是优先级高,R正在运行的进程, l表示的是多线性进程,N优先级低,Z僵尸进程,D不可中断休眠进程,+前台进程。
[root@lokott ~]# ps -elf //当前-长格式-完整形式 F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD4 S root 1 0 0 80 0 - 52535 ep_pol 14:23 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 211 S root 2 0 0 80 0 - 0 kthrea 14:23 ? 00:00:00 [kthreadd]1 S root 3 2 0 80 0 - 0 smpboo 14:23 ? 00:00:00 [ksoftirqd/0]1 S root 5 2 0 60 -20 - 0 worker 14:23 ? 00:00:00 [kworker/0:0H]1 S root 6 2 0 80 0 - 0 worker 14:23 ? 00:00:00 [kworker/u256:0]1 S root 7 2 0 -40 - - 0 smpboo 14:23 ? 00:00:00 [migration/0]1 S root 8 2 0 80 0 - 0 rcu_gp 14:23 ? 00:00:00 [rcu_bh]....
解释:PPID表示父进程 PRI表示的是用户态的优先级 NI表示的是NICE值(内核),范围是(-20~19)值越低越优先
,SZ交换分区占用的空间大小
(3)补充
在ps命令中一般可以结合管道符号和grep等命令组合使用,提高工作效率
(4)动态查看top
[root@lokott ~]# top //每三秒会自动刷新一次top - 15:58:48 up 1:35, 3 users, load average: 0.00, 0.01, 0.05Tasks: 190 total, 1 running, 189 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stKiB Mem : 999696 total, 65636 free, 711552 used, 222508 buff/cacheKiB Swap: 4194300 total, 4160824 free, 33476 used. 78272 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 619 root 20 0 231608 3264 2836 S 0.3 0.3 0:03.25 vmtoolsd 4582 root 20 0 0 0 0 S 0.3 0.0 0:00.20 kworker/0:2 1 root 20 0 210140 4864 3024 S 0.0 0.5 0:01.35 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.06 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H .....
在top命令下,进程的查看是动态变化的,m可以进行内存使用率排序c可以进行cpu排序,q可以退出,或者Ctrl+c直接终止该命令。
四、条件查看进程
pgrep命令
在man手册中pgrep和pkill是放在一起的,如下所示:
NAME //命令名称,根据名字或者其他属性查找进程
pgrep, pkill - look up or signal processes based on name and other attributes
SYNOPSIS //表示的是命令的格式
pgrep [options] pattern
pkill [options] pattern
DESCRIPTION
pgrep looks through the currently running processes and lists the process IDs which match the selection criteria to stdout. All the criteria have to match. For example,
$ pgrep -u root sshd will only list the processes called sshd AND owned by root. On the other hand, $ pgrep -u root,daemon will list the processes owned by root OR daemon. pkill will send the specified signal (by default SIGTERM) to each process instead of listing them on stdout.
那么我就根据上面给出的例子来进行实验:(pkill下面有讲)
[root@lokott ~]# pgrep -u root sshd //仅仅列出名称为sshd且属于root的进程号10022820[root@lokott ~]# pgrep -u root,daemon |wc -l //列出属于root或者daemon的所有进程号到管道中统计数量175[root@lokott ~]# pgrep -l "log" //查看包含log的进程id和信息292 xfs-log/sda2479 xfs-log/sda5480 xfs-log/sda1593 abrt-watch-log596 systemd-logind601 rsyslogd602 abrt-watch-log2735 xfs-log/md0
树型查看--pstree
-aup "-"不可以省略,pstree -ap 用户名
五、进程的启动方式
1.启动进程
(1)手工启动
前台启动:用户输入命令,直接执行程序
后台启动:在命令行尾加入"&"符号
(2)调度启动
进程的前后台调度
Ctrl+z--停止进程
jobs -l --查看进程状态
fg 序号--将进程掉到前台来执行
bg 序号--将停止的进程在后台继续执行
[root@lokott ~]# umount /mnt[root@lokott ~]# mount /dev/sr0 /mntmount: /dev/sr0 写保护,将以只读方式挂载[root@lokott ~]# df -hT文件系统 类型 容量 已用 可用 已用% 挂载点/dev/sda2 xfs 20G 4.4G 16G 22% /devtmpfs devtmpfs 474M 0 474M 0% /devtmpfs tmpfs 489M 0 489M 0% /dev/shmtmpfs tmpfs 489M 7.2M 482M 2% /runtmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup/dev/sda5 xfs 10G 37M 10G 1% /home/dev/sda1 xfs 6.0G 158M 5.9G 3% /boottmpfs tmpfs 98M 4.0K 98M 1% /run/user/42tmpfs tmpfs 98M 24K 98M 1% /run/user/0/dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt[root@lokott ~]# cd /mnt/[root@lokott mnt]# lsCentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7EFI images Packages RPM-GPG-KEY-CentOS-Testing-7EULA isolinux repodata TRANS.TBL[root@lokott mnt]# cd [root@lokott ~]# cp -r /mnt/Packages/ /opt/ & //&符号就是将该命令放在后台运行[1] 5354[root@lokott ~]# jobs -l //查看进程完成状态[1]+ 5354 完成 cp -i -r /mnt/Packages/ /opt/[root@lokott ~]# cp -r /mnt/Packages/ /opt/ //删除原来的然后重新再前台执行命令^Z[1]+ 已停止 cp -i -r /mnt/Packages/ /opt/[root@lokott ~]# jobs -l //查看进程状态[1]+ 5403 停止 cp -i -r /mnt/Packages/ /opt/[root@lokott ~]# fg 1 //调出后台进程到前台来进行运行cp -i -r /mnt/Packages/ /opt/^Z[1]+ 已停止 cp -i -r /mnt/Packages/ /opt/[root@lokott ~]# kill -9 5403 //强制kill 掉进程(-9)[root@lokott ~]# jobs -l[1]+ 5403 已杀死 cp -i -r /mnt/Packages/ /opt/
(3)终止进程
Ctrl+c --中断正在执行的命令
1.kill、killall命令
kill用于终止指定PID号的进程 -9 表示强制终止
killall用于终止指定名称的所有进程
上面的实例中已经给出了kill 的实例,下面看一下killall的实例:
[root@lokott ~]# vim 1.sh &[3] 5696[root@lokott ~]# vim 2.sh &[4] 5697[3]+ 已停止 vim 1.sh[root@lokott ~]# jobs -l[1] 5694 停止 (tty 输出) vim 1.sh[2] 5695 停止 (tty 输出) vim 1.sh[3]- 5696 停止 (tty 输出) vim 1.sh[4]+ 5697 停止 (tty 输出) vim 2.sh[root@lokott ~]# killall -9 vim[1] 已杀死 vim 1.sh[2] 已杀死 vim 1.sh[3]- 已杀死 vim 1.sh[4]+ 已杀死 vim 2.sh[root@lokott ~]#
2.pkill命令
根据特定条件终止相应的进程--pkill命令(实际上用的非常多)
-U:根据进程所属的用户名终止相应进程
-t:根据进程所在的终端终止相应进程
[root@lokott ~]# pgrep -l -U "zhangsan"1472 gnome-keyring-d1491 gnome-session-b1498 dbus-launch1499 dbus-daemon1557 gvfsd1562 gvfsd-fuse1649 ssh-agent1668 at-spi-bus-laun1673 dbus-daemon1678 at-spi2-registr1695 gnome-shell.......2208 gvfsd-metadata2211 ibus-engine-sim[root@lokott ~]# pkill -9 -U zhangsan //前台是本地是张三登录的状态此时服务器那边会将zhangsan用户踢出,然后到登录界面
小结:普通用户是无法用pkill命令踢出root,但可以用pgrep查看
六、计划任务管理
(1)at命令设置计划任务
命令格式--at [HH:MM] [yyyy-mm-dd]
注意:这个命令是必须将时间用在之后的时间,例如:at 10:33 2020-08-05
然后输入命令,最后Ctrl+D
date命令--获取当前时间
atq--查看准备被执行的进程列表
atrm 2--删除
请看实例:
[root@lokott ~]# date //显示当前时间2019年 11月 12日 星期二 17:28:24 CST[root@lokott ~]# at 17:35 2019-11-12 //设定计划任务at> pgrep -U root |wc -l > /opt/ps.txtat> job 1 at Tue Nov 12 17:35:00 2019[root@lokott ~]# cat /opt/ps.txt //由于时间未到所有没法看到cat: /opt/ps.txt: 没有那个文件或目录[root@lokott ~]# atq1 Tue Nov 12 17:35:00 2019 a root[root@lokott ~]# at 17:34 2019-11-12at> echo "123" > 1.txtat> job 2 at Tue Nov 12 17:34:00 2019[root@lokott ~]# atq //查看一次性任务命令1 Tue Nov 12 17:35:00 2019 a root2 Tue Nov 12 17:34:00 2019 a root[root@lokott ~]# ls1.txt note 模板 文档 桌面anaconda-ks.cfg shell 视频 下载initial-setup-ks.cfg 公共 图片 音乐[root@lokott ~]# cat 1.txt 123[root@lokott ~]# atrm 1 //删除还未执行的任务[root@lokott ~]# atq[root@lokott ~]# atrm 1 //已删除和已经完成的任务无法再次删除Cannot find jobid 1
该序列号是固定的,而不是动态的,这是为了避免多终端时大家删除任务的时候误删
(2)周期性计划任务配置--crontab命令
crontab命令(重要)--定时任务(按照预先设置的时间周期重复执行用户指定的命令操作),man手册上的介绍是:crontab - maintains crontab files for individual users
- crontab -e [-u ]
- -l--list
- -r--remove 所有的
编写格式为分 时 日 月 周 命令,下面的/etc/crontab文件中有显示写入格式
其中*表示该范围内的任意时间,-表示连续的时间
,表示不连续的时间点,/表示频率
对于该命令,我的理解就是--"私人订制",这个命令可以用来存储一个定时任务制表文件,可以用来对周期性定时任务的设置(-e)删除(-r)和查看(-l)等操作,实例如下:
[root@lokott ~]# which crontab //查看crontab命令的位置/usr/bin/crontab[root@lokott ~]# cat /etc/crontab //查看命令的配置文件信息SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=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@lokott ~]# crontab -e //打开一个交互窗口写入命令,命令在下面用-l参数可以显示no crontab for zhangsan - using an empty onecrontab: installing new crontab[root@lokott ~]# crontab -l //显示写入的命令代码,表示每分钟写入一次12346* * * * * echo "12346" >> 1.txt[root@lokott ~]# cat 1.txt hellohello[root@lokott ~]# cat 1.txt hellohello123461234612346
主要的设置文件位置:
- 全局配置文件,位于文件/etc/crontab --实例中已经给出
- 系统默认的设置位于目录/etc/cron.*/
- 用户定义的设置(必默写)位于文件/var/spool/cron/用户名。在编辑命令的过程中错误的命令被执行的时候会将错误的信息存放到该文件中:/var/spool/mail/zhangsan
[root@lokott ~]# ls /etc/cron.*//etc/cron.d/:0hourly raid-check sysstat/etc/cron.daily/:logrotate man-db.cron mlocate/etc/cron.hourly/:0anacron/etc/cron.monthly/:/etc/cron.weekly/:[root@lokott ~]# su - zhangsan[zhangsan@lokott ~]$ crontab -l5 10 * * 1-5 echo "haha" > 1.txt //周一至周五10:05执行命令6 10 * * 2,4,6 echo "ttuu" >> 1.txt //周二、四、六的10:06执行命令10 10-14/2 * * * echo "sdas" >> 1.txt //每天的10点10分至14点10分每两小时执行一次命令*/5 * */2 * * ls ./shell //每隔两天,每隔5分钟执行命令[root@lokott zhangsan]# cat /var/spool/cron/zhangsan //用户定义的设置在该文件中5 10 * * 1-5 echo "haha" > 1.txt6 10 * * 2,4,6 echo "ttuu" >> 1.txt10 10-14/2 * * * echo "sdas" >> 1.txt*/5 * */2 * * ls ./shell*/1 * * * * echo "sdsad" >> 1.txt[zhangsan@lokott ~]$ crontab -e //我准备添加新的计划任务crontab: installing new crontab您在 /var/spool/mail/zhangsan 中有新邮件 //提示我有新的内容,其实就是报错的信息,信息如下所示[zhangsan@lokott ~]$ cat /var/spool/mail/zhangsanFrom zhangsan@lokott.localdomain Wed Nov 13 10:05:02 2019Return-Path: X-Original-To: zhangsanDelivered-To: zhangsan@lokott.localdomainReceived: by lokott.localdomain (Postfix, from userid 1001) id 04DC131C6EDF; Wed, 13 Nov 2019 10:05:01 +0800 (CST)From: "(Cron Daemon)" To: zhangsan@lokott.localdomainSubject: Cron ls ./shellContent-Type: text/plain; charset=UTF-8Auto-Submitted: auto-generatedPrecedence: bulkX-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20191113020502.04DC131C6EDF@lokott.localdomain>Date: Wed, 13 Nov 2019 10:05:01 +0800 (CST)
七、总结
本文主要是对Linux中进程和计划任务的管理的介绍和命令演示,包括静态查看(ps)和动态查看(top)进程命令,按条件查看(pgrep)和以树型结构查看(pstree);其次是对进程控制的介绍,包括启动进程,调度进程(Ctrl+Z、jobs、fg、bg)以及终止进程的命令(kill、killall、pkill);最后是对计划任务设置命令的介绍,即at和crontab命令,其中注意at是一次性有效,且需要在当前时间(date命令查看当前时间)之后,有年份设置,而crontab命令是计划性周期命令,没有年份的设置。
最后感谢阅读!