Linux学习笔记之七(进程管理下和重定向上)

接六。

上一讲的命令都是看内核版本,如何看centos的发行版本呢?

我们当时下的就是1804的版本。

我们人看到的是user,group,process,file,而计算机看但是uid,gid,pid,ppid,inode num。计算机管理进程需要知道pid,我们要想干预进程的管理呢,就

知道pid,当然启动进程只需要运行程序文件即可。

那么如何查看指定进程的pid呢,以方便我们去管理呢?有以下方式:


一般就看pgrep的第一个何pidof的最后一个。

这四种方法选哪一种呢?这要根据需求,ps aux |grep这种方式比较适合人看,因为人可以从复杂的信息中提取,如果是写在脚本里面,也就是让计算机看,还是其它三种比较好。

不过cat /run/sshd.pid这种能用的范围太小了,只有在/run里面有的.pid才能看。但是呢,/run里面只有很少的文件。


如果没有,就没办法看。所以还是pidof何pgrep好一些。

上上一讲还用过pstree,稍微拓展一点。


以上内容参考了https://blog.csdn.net/zhang2531/article/details/52092488。和https://blog.csdn.net/wynter_/article/details/73825978

top

top就像任务管理器一样,是动态的查看,或者如果有人装了带UI的linux里面有一个叫做资源监视器的东西。先来看一下:

看到左上角的时间每次跳三秒,也就是每三秒刷新一次。但是有时候是跳一秒,那是因为我按了回车就会立即刷新。默刷新时间间隔是3s,那么可不可以设置这个刷新时间呢?是可以的。

就要使用-d这个参数了,后面跟的是刷新的间隔,我们改为5试一下。


还可已查看指定进程的信息,指定用户的进程等。



上面我们可以看到top的信息可以分为量部分,一部分是系统整体统计信息。

有时间,系统运行时间,你可以去上面看看,我的虚拟机已经运行了6小时15分了。还有用户的数量。我们也可以w查看。还可以看到总的进程(任务)数,在运行的,睡眠的,被停止的和僵尸状态的进程数。还有cpu的时间分配,us是用户进程占用的时间,sy是系统进程占用的时间,ni是优先进程占用时间,是我们按照自己的喜好,比如我喜欢这个进程,我就要人为地多分配时间给它,id是空闲时间,wa是等待时间,通常有磁盘io操作的时候这个不是0。hi,si,st呢,和搭建虚拟环境有关(一般不会有人闲到在虚拟机上再搭建虚拟机吧),不用管。

下面的Mem和Swap是内存和交换分区的资源占用情况。lscpu可以看cpu数,前面也用过一次。

当然上面还漏掉了了负载。

下面是红帽官方的一个例子。

0.73可以认为过去一分钟cpu占用73%,而1.12表示过去5分钟,cpu超载12%,1.3是过去15分钟,cpu超载30%,这个负载最好不要超过1,不然cpu相当于是超载的。货车超载可能后果很严重,虽然cpu超载后果没那么严重,但是肯定还有有一些损害的。

第二部分是一些进程的信息。就是下面这些了。

NI暂时没讲,有兴趣的可以看看https://www.cnblogs.com/ningvsban/p/3938449.html

https://blog.csdn.net/mmshixing/article/details/51305138

VIRT是虚拟内存,RES是驻留内存,SHR是共享内存,S是状态,剩下的都知道什么意思。

上图是一些在top里面的操作。我来演示几个。排序的那几个就不试了。

在top里面h或者?可以查看帮助,z是改变颜色。

如果第二部分没有你想看的,还可以按f添加,比如我想看PPID

。那么需要按f进入选择界面,粗体和前面带*号的是已经显示的,按上下移动到PPID的位置,然后按空格就可添加到显示列表里了,前面会出现*,字体也加粗了,但是显示位置是在最右边,如果还想调整位置,按→,选中,然后可以上下移动,按esc或者q退出去,可以看到有PPID了,但是这样是一次性的,重新进入之后,就会又没有PPID了,这个时候就需要用W。

如果按了W就会保存设置,并且我们看到会有一行字。是保存已经修改到/home/lcl/.toprc里面了,这个文件是隐藏文件,是top的一个配置文件,还看到有.bash_history这个应该是存历史命令的文件了,.viminfo是存vim设置的文件,这些文件不要随便改,不然可能会有大问题。

并且呢,既然这些文件是在个人的文件夹下,那么说明这些设置或者历史是只针对个人的,我们切换个用户看看,top的设置还在吗?

果然就没有了。再切回去呢?

还在。再看一下1和<>有什么用。

1是看每个cpu的详细信息,<>只是上下翻而已,

我们看到systemd的PPID是0,systemd是系统内核启动的,这个0也能理解吧。

控制进程

我们可以用过下面的几个命令给进程发送信号,(应该是没有pgrep的)



下面演示几个常用的信号。

我事先装好了软件。

PID确实没变化,但是这个测试呢,似乎感觉不到1信号起过什么作用。再来看一个:



为什么会出现上面的现象呢,仔细看一下HUP的描述,也可以用来申请重载配置没,但是没有经过正常的结束过程,也就是说并没有保存,所以cat 会报错的,只会出现一个.1.swap的隐藏文件,你可以继续编辑的,只要vim 1之后按r再回车。我就这样:wq了一下,这个.1.swap还是存在。

甚至重启之后还是存在,看来只能我们手动rm -f .1.swap了。

这个测试和上面一样,只是想强调同一个程序文件两次启动进程的PID是会变化的。


主要是来看一下9强制停止和15停止的区别。kill什么都不加就是相当于kill -15,15是默认的信号。

提示的信息一个是killed,一个是terninated。但是还都会产生swap文件。


我们看9的描述是造成突然的程序结束,不能被封锁和无视,经常用在严重的情况下。

而15里写着,可以被封锁和无视,有的软件可能会无视15信号,这时候可以考虑一下-9,强制结束。19和20的区别和9和15有点像,遇到不听话的进程,就用19吧,下面来试试18,19,20。


可以看到-20就被httpd给无视了。

对于vim这类需要你打vim才能启动的进程,暂停以后再恢复也没办法进入编辑界面了,你再vim一次会看到有一个swap文件,并且原来的进程确实在still running,不过你没办法进入编辑的界面了。passwd甚至不能被恢复,虽然不太清楚原因。

上面还提到了一种killall的方式,这种方式的好处就是可以后面加进程名字,而不是pid。而kill后面必须是pid。这也很好理解,killall有个all,如果还输入pid,和咸鱼有什么区别,killall可是可以对同一软件的进程操作的。


killall还有一定的好处,就是前面说的可以直接批量对进程操作,不过一般的软件都是带有stop命令的。

虽然kill后面也可以,但需要大括号,加逗号隔开,还需要打一长串的pid,麻烦。killall还可以针对用户来杀,选项是-u。




pkill也可以针对某个用户,但是它更为强大的是可以针对某个终端,-t。

-15或者什么都不加只是杀死终端上的所有进程。-9是直接结束了会话。

top也可以给进程发信号。

进入top以后按k,然后输入pid(默认是最上面一个的pid),注意pid不能从小键盘输入,至少我的电脑是这样的,因为键盘布局的原因。然后输入信号编号(默认是15)。

下面啊就来看一下上一讲提到过,但是没有细讲的nice,参考了。

https://blog.csdn.net/YanceyZ_DL/article/details/51338148

PR和NI的设置




默认加的niceness是10。

格式是nice -niceness cmd,正数超过19就会变为19。如果想输入负值,如下,并且确实只有root的权限才可以把niceness设为负,负值需要两个-。




需要说明的还有一点,就是root可以调整任意人的niceness(-20-19),而普通用户只能调整自己的niceness,并且nice值必须为正,也就是不能设为高优先,只能设为低优先。


在linux7里init变成了systemd。

重定向

如上图所示,一个进程一般会有输入和输出,当然这指的是一般情况。前面曾经说过,linux里一切皆文件,那么这个进程的输入从哪里来?输出到哪里去呢?答案都是文件,在linux

里面呢,和进程输入输出相关的文件都放在各自进程目录下的fd里。我们先来看一下。

fd默认的权限普通用户时看不了的。切到管理员root。

颜色我就不带你们看了,dircolors -p,自己去找颜色的文件类型的对应关系,当然看权限前面的字符也可以粗略知道文件类型,没有看颜色得到的具体。

看到里面有很多文件,/dev/null是设备文件,相当于垃圾桶,你可以把不想要的信息放这里面。每个文件前面都有一个编号,这个编号叫做文件描述符或者文件句柄,是计算机用来区别文件的,看到这里你可能会认为这是不是有点像uid,pid,可以叫做fid?对比一下下面的


看到每个进程目录里的fd里即使文件描述符一样,文件也不一定一样,或者说同一个文件对应的文件描述符也不一定一样。总之呢,把文件描述符看成一个代号就好了,实际上呢,fd里存的是一个文件数组,数组里每个元素都是文件,文件描述符是文件在数组里面的索引,每个进程fd里的数组是不一定一样的。在这些文件描述符里,0,1,2有特别的含义。

描述符0对应的文件一般是标准输入,一般从键盘输入,当然也可以是终端,比如上面的/dev/null和/dev/pts/1。1对应的文件一般是标准输出(习惯称之为正确的输出),一般是输出到终端。2对应的文件是标准错误输出(下面都称之为错误输出),一般也是输出到终端。3+的一般对应其它的文件。说一般或者是默认就代表是可以修改的,下面就举几个例子。


把前两个例子放在一起,比较覆盖和追加。

这个应该还是比较简单的,重定型的符号>前后可以都不加空格,也可加,还是加上比较好的,因为date这个命令现在没有给参数,不会造成误解才没有加。>前面如果是1,也就是正确的输出文件,1可以省略,上面也说明了这一点。那么到底变了没有呢?

date是看不到的,因为这个命令的寿命太短了,下面我们拿sleep来举一个例子。

我们再举一个例子体会终端也是一种文件。

还说明这种重定向是一次性的,重启进程时,输入输出的文件又会恢复为默认的。


像这种后面有参数的命令,如果不在>前加空格就会造成误解,系统会认为>和后面的内容也是文件路径(或者其它参数的一部分)。

这种做法我认为就等价于 2>list.txt >>list.txt。拿ll举一个例子:

拿sleep来看一下效果:

这里来说一个小事情,就是用sudo的时候,后面的命令一律不接受别名。

没有sudo的时候看到的都是彩色的,因为其实colors==anto是自动的。

一旦使用sudo,就会变成白的,没有颜色的原始的/bin/ls

下面是另一个例子。

即使在root用户时再执行一次别名,sudo还是不能使用别名命令。

这是另一种做法,用文件描述符的做法,那么有人可能会有这样的以后如果把&去掉会有什么效果?

如果不加&,只会创建一个名字为1的文件而已,&1代表的是文件描述符的路径,这让我想起了C语言里的&,&a就代表a变量的地址,那么&1就可以理解为文件描述符1的文件路径了。

那么我们还是看一下sleep的效果。

貌似用了sleep还没有介绍sleep干嘛用的,顾名思义,就是睡眠,和汇编里的NOP(no operation)是一样的。

到这里呢,你们应该已经了解了,重定向分为两种情况:一是后面的文件路径不存在,那就相当于touch,需要目录的wx属性,二是后面的文件存在,相当于改写文件的内容,需要文件的w和目录的x。下面举个例子(因为某种不可描述的原因,我把虚拟机玩坏了,重装了一个,所以看到主机名不一样,不要大惊小怪):



如果你不关心某个输出,可以把它定向到/dev/null。

如果是上面这种呢?如果文件不存在,就相当于touch,如果文件已经存在,那么就是清空文件,这个时候如果你是管理员会很危险,我不会告诉你我是怎么把虚拟机搞坏的233。总之,在平时的工作环境中,最好使用有sudo权限的一般用户即可,root用户太为所欲为,有时候可能干出一些你后悔莫及的事而不给你任何提示。

下面是尝试如果两次重定向会如何,结果是以后面的为准,是不可能出现一个索引上有两个文件的。

当然重定向的知识不止这么少。

to be continued...

猜你喜欢

转载自blog.csdn.net/qq_41740705/article/details/80919086