进程和任务计划管理

ps可以查看进程的信息,PID是进程号,TTY是终端的名称,pts是远程终端,tty1是本地登录终端的名称,时间是占用cpu的时间,CMD就是在执行的命令。下图就是两个进程都是在叫pts/0的终端上运行的。想看到本地的登陆终端就相当于在服务器上直接登录,用w可以查看到

                       

ps只能看进程的少部分信息,可以跟参数aux来用

ps aux特点是可以看到进程占用CPU或MEM内存的百分比

 

ps -ef显示系统内所有的进程信息,通常用来过滤某个服务或进程看它是否处于启动状态,看它活着没有。

还可以让它只显示排除自己的过滤进程后的进程信息。第一行就是父进程的信息,1是他的父进程的PID号,925是他自己的。下面一行是终端pts/0以用户root在登录我的sshd。就代表一个用户连接sshd的进程。

格式:ps -ef | grep “服务名” | grep -v grep

 

再起一个连接终端名是pts/1,父进程依旧是PID号为925的sshd父进程。终端以pts/1连过来的用户。

 

 

 

 

top动态查看系统进程信息。注意:当cpu占用率过高时不应该直接执行top命令查看,可以将信息重定向到一个文件里查看,以免cpu占用率过高导致崩溃。

 

pgrep后跟服务名直接显示和服务有关的PID号,加参数-l可以显示服务名的PID号

pgrep 服务名 | head -1可直接显示出父进程的PID号

 

 

进程的启动方式

Ctrl+z将前台进程调入后台并停止执行

fg将后台进程调到前台,后跟数字指将某个具体的后台进程切到前台,不加默认是将上一次调到后台的进程切回前台

jobs看调到后台的有哪些进程

 

三个“杀”

①    kill根据PID号杀进程,温柔杀

格式kill  PID号 加-9或者-kill是强杀

②    pkill 根据服务名杀,比较强力,不杀后代。还能踢人,就是根据终端名杀,整个进程都掉线。

③    killall根据服务名杀,子孙后代全杀光,-9或-kill强杀(了解即可,太危险容易出事)

 

linux操作系统垃圾回收机制原理:通常情况下,子进程是由父进程生成的,因此子进程一旦执行结束,默认由他的父进程来收尸。如果父进程比子进程死得早,那么子进程默认会交给父进程的父进程来管理来收尸,假如所有父亲都没了,默认会交给所有父进程的总进程,也就是init主进程来收尸。没人收尸的话,就会产生僵尸进程。

什么是僵尸进程?

刚才我们说了,儿子死了默认爸爸收尸,爸爸先死了默认爷爷收尸,假如,爸爸确实死了,死之前没有来得及通知爷爷代为收尸,于是儿子被忘了,也就没人来收尸了,这种情况,儿子就是僵尸进程。

僵尸进程的产生?

通常代码都是开发写的,爸爸死了通知爷爷来收尸的这个通知代码他忘了写了,服务器运行这个程序,就会发生儿子没人收尸的情况。

产生的后果?

僵尸进程最可怕的后果不是资源的占用,因为一个进程占用不了太多的资源。可怕的是僵尸进程会永远占用PID号,操作系统PID号是有限的,如果不够用了,linux会默认什么服务都开启不了。PID号上限是65535

怎么排查僵尸进程?

①    用top命令打开会看到第二行的右上角最后一个单词zombie就是僵尸的意思,前面是0就说明系统里没有。

②    用ps aux默认回车后有一个STAT,僵尸进程的符号是Zz,所以我们可以用过滤的方法

ps aux | grep “^Zz$”过滤不出来说明没有,还可以

ps aux | grep “^Zz$” | wc -l如果过滤出来的是0行说明没有。还可以

ps -o pid,stat指定输出PID号和状态,加参数-ef是显示系统中所有进程的PID号和状态。先显示出再用过滤。

             

 

                            Linux定时任务crond

Linux操作系统里默认就有定时任务的执行,系统日志的路径是/var/log/messages*,系统日志,周期性切割日志,每七天做一次切割,自动运行。

定时任务的特点,有五个时间段

*分*时*日*月*周    (用五个*表示,分别是分时日月周)

定时任务的写法:写成五个*就是每分钟都会执行后面的命令。*****后跟的是命令的绝对路径。

 

 

/var/spool/cron这个路径就是存放定时任务的

crontab -l 查看当前用户的定时任务

crontab -e(e是编辑状态,相当于直接打开了一个vim,这个vim打开后就会放到/var/spool/cron/)在里面我们可以写定时任务。

crontab -u 指定看的用户的定时任务 格式:crontab -u 用户名 -l(不指定用户默认看的是当前用户)

crontab -r 递归删除定时任务,全删,谨慎使用。

定时任务的日志文件路径/var/log/cron

tail -f /var/log/cron动态查看定时任务的日志文件

 

 

 

 

从定时任务的日志里看,刚才设置的定时任务被执行了5次

 

 

每分钟都会被执行,一直执行下去

 

 

 

 

 

 

 

 

 

 

 

 

 

 

定时任务的配置文件/etc/crontab

SHELL是指定解析器,shell的版本使用的是bashell,用/bin/bash去解析定时任务里的命令。

PATH 环境变量,告诉linux你敲一个命令,让他去哪找命令,去哪些路径下去找。没有环境变量的话,输命令就要输绝对路径才能找到这个命令并且执行。export全局生效全局声明,同一个父亲下的儿子子进程都生效

 

MALLTO=root给root发邮件,定时任务默认会给root发邮件,什么情况下会给root发邮件呢?定时任务如果有屏幕数据输出的时候会给root发邮件(前提是postfix邮件服务是开启状态)

 

 

上图黄色部分是root超级用户开始编辑普通用户yunjisuan,替换了普通用户的定时任务,结束编辑定时任务,这三行记录了定时任务的操作。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

我们开始查找邮件,/var/spool/mail下记录了哪些用户发过邮件,我们打开yunjisuan用户的就会看到yunjisuan用户发的邮件。工作中可能有很多的普通用户,普通用户又会有很多的定时任务,root用户一般不登录,如果登录了,就会一次性签收好几百封邮件,如果总给root用户发邮件,就很不好,所以我们要求,定时任务不能有任何屏幕输出。

 

 

 

 

 

 

 

 

 

由下图我们可看出,定时任务配置文件里的环境变量和linux操作系统的PATH不一致,这就意味着,我们在写定时任务的时候有的命令linux能找到,但是定时任务找不到,此时定时任务必然出错。所以,在我们学习的时候,就要养成良好的学习习惯,定时任务里的命令必须用绝对路径。

 

HOME=/ 定时任务的启动路径永远从根开始。所以,写定时任务的时候,起始点一律是根,不然也会出错。

 

 

总结,写定时任务时需要注意的几个问题:

①    首先要关注定时任务环境变量PATH,我们为了不出错,写定时任务时一律用命令的绝对路径

②    要知道定时任务的任何命令的起始点都是在根下

③    定时任务不能有任何屏幕输出,有屏幕输出的话一律重定向到某个文件里,我们可以将没用的重定向到/dev/null垃圾箱文件里,这样就不会产生邮件了。

 

假如会产生屏幕输出,我们却不重定向,但是把postfix邮件服务给关了这样也不会再产生邮件了,阻止邮件发送,邮件发不出去会在/var/spool/postfix下有个maildrop(丢弃的邮件)cd进去之后会看到里面有很多的小文件,每执行一次定时任务就会产生一个小文件。

总结:如果postfix处于关闭状态,然而定时任务会产生屏幕输出的话,那么邮件就不会再发给root账号,而是会在/var/spool/postfix/maildrop/生成众多小文件。这些小文件会占用系统中的inode号,而inode号也是有上限的,一旦到达上限,再创建文件就创建不了了,就意味着磁盘明明还有容量,但是却不能放东西了。

注意:磁盘还能不能放东西取决于两点

①    df -h看磁盘的真实容量,看它满不满

②    df -hi看inode号还有没有

这两个任何一个满了,磁盘都存不下东西了。

 

posted @ 2018-10-24 18:04  熊猫爱吃竹子  阅读(265)  评论(0编辑  收藏  举报