Linux(六)进程管理

Linux系统管理

linux中的进程与服务

进程:Linux中正在执行的程序或者命令

服务:Linux中一直存在、常驻内存的进程

守护进程:进程按照运行方式进行划分,又分为前台显示和后台显示的进程(服务全部属于后台进程),而负责执行这些系统服务的进程我们称之为守护进程

守护进程在后缀会添加一个d,即dame

CenterOs7中就是通过一个systemd的守护进程来进行启动各种系统服务

查看systemd下的服务:

ls /usr/lib/systemd/system
abrt-ccpp.service                        graphical.target.wants                 plymouth-read-write.service                    suspend.target
abrtd.service                            gssproxy.service                       plymouth-reboot.service                        swap.target
abrt-oops.service                        halt-local.service                     plymouth-start.service                         sys-fs-fuse-connections.mount
abrt-pstoreoops.service                  halt.target                            plymouth-switch-root.service                   sysinit.target
abrt-vmcore.service                      halt.target.wants                      polkit.service                                 sysinit.target.wants
abrt-xorg.service                        hibernate.target                       postfix.service                                sys-kernel-config.mount

target表示一组服务的集合

[root@hadoop100 ~]# ls /usr/lib/systemd/system | grep d.service
abrtd.service
anaconda-sshd.service
atd.service
auditd.service
cgdcbxd.service
cgred.service
chronyd.service
colord.service
containerd.service
crond.service
cups-browsed.service
firewalld.service
fprintd.service
fwupd.service
iscsid.service
ksmtuned.service
...

这些守护进程守护的就是各种系统后台进程

1 CenterOs7 的服务管理

基础语法 systemctl start | stop | restart | status
查看服务 /usr/systemd/system
ps [options] 查看系统进程状态
[root@hadoop100 ~]# ps
   PID TTY          TIME CMD
  3610 pts/0    00:00:00 bash
  8932 pts/0    00:00:00 ps

直接输入ps只会显示当前用户以及与当前终端相关联的进程

  • a:列出带有终端的(前台进程)所有用户的进程

  • x:列出当前用户的所有进程,包括没有终端的进程(后台进程)

  • u:面向用户友好的显示风格

  • -e:列出所有进程

  • -u:列出某个用户关联的所有进程

  • -f:显示完整格式的进程列表(与u相同)

常用的组合:aux、-ef

可以看到上面的命令选项格式是不同的,-代表的是UNIX的编程风格,而不带-表示是BSD风格

可以使用-aux但是不推荐,因为linux会自动翻译为aux,但是,万一系统中存在一个叫做x的用户,那么这个命令显示的就是x用户的进程了。

ps aux 显示进程信息详解
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0 193944  7088 ?        Ss   Nov14   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    Nov14   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   Nov14   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    Nov14   0:00 [ksoftirqd/0]
root          7  0.0  0.0      0     0 ?        S    Nov14   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    Nov14   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    Nov14   0:07 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S<   Nov14   0:00 [lru-add-drain]
root         11  0.0  0.0      0     0 ?        S    Nov14   0:00 [watchdog/0]

STAT:进程的状态,常见状态有:

  • R:运行状态

  • S:睡眠状态,等待时间出现就会唤醒

  • s:包含子进程

  • T:暂停状态

  • Z:僵尸状态(zombie),进程即将结束,但是一些信息没有清理完成(比如父进程还需要子进程的一些信息),只剩一副空壳但是还占着系统资源

  • l:表示多进程运行

  • +:前台显示

  • <:当前进程有很高的优先级

  • N:进程优先级比较低

COMMAND:产生该进程的命令

VSZ:虚拟内存大小

RSS:物理内存大小

TTY:终端,?表示没有终端,即后台进程。对CentOs来说,tty1是图形化终端,tty2-tty6是本地的字符终端界面,pts/0-255表示虚拟终端

START:进程启动的时间

TIME:占用CPU的时间

一号进程/usr/lib/systemd/system是linux系统运行的第一个初始用户进程

二号进程kthreadd:负责所有内核线程的调度和管理的守护进程,很多系统级别的服务都是以系统线程的形式运行的,然后交由这个守护进程来管理。

ps -ef 显示进程信息详解
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 Nov14 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 Nov14 ?        00:00:00 [kthreadd]
root          4      2  0 Nov14 ?        00:00:00 [kworker/0:0H]
root          6      2  0 Nov14 ?        00:00:00 [ksoftirqd/0]
root          7      2  0 Nov14 ?        00:00:00 [migration/0]
root          8      2  0 Nov14 ?        00:00:00 [rcu_bh]
root          9      2  0 Nov14 ?        00:00:07 [rcu_sched]
root         10      2  0 Nov14 ?        00:00:00 [lru-add-drain]

PID指的是进程id,PPID则指的是父进程ID

STIME:开始时间

UID:进程用户

可以看到1、2号进程的父进程是0号进程,0号进程即是idle,他是运行在系统内核态的系统进程

其他系统进程的父进程都是2号,用户进程则是0号

aux 和 -ef的选择

当需要查看进程cpu、内存占用率则使用aux,想要查看父进程则使用-ef

查看远程登录进程 ps -ef | grep sshd
[root@hadoop100 ~]# ps -ef | grep sshd
root        953      1  0 Nov14 ?        00:00:00 /usr/sbin/sshd -D
root       3376    953  0 Nov14 ?        00:00:00 sshd: root@pts/0
root      14246    953  1 02:54 ?        00:00:00 sshd: hikaru [priv]
hikaru    14258  14246  0 02:54 ?        00:00:00 sshd: hikaru@pts/1
root      14298   3610  0 02:54 pts/0    00:00:00 grep --color=auto sshd

可以看到使用hikaru用户登录之后有两个hikaru进程,一个用户显示为root,另一个显示为hikaru,除此之外,第二个进程是通过虚拟终端pts1登录的且它的父id正好是用户为root的进程。而第一个进程创建的目的是为了实现权限分离

kill [选项] pid 终止进程

比如我们想要关闭上面的hikaru的用户终端,既可以关闭14258,也可以关闭14246(父进程关闭子进程也会关闭),然后在终端就可以看到连接被关闭了。

kill掉sshd守护进程,会发生什么?
[root@hadoop100 ~]# ps -ef | grep sshd
root        953      1  0 Nov14 ?        00:00:00 /usr/sbin/sshd -D
root       3376    953  0 Nov14 ?        00:00:00 sshd: root@pts/0
root      14763   3610  0 03:40 pts/0    00:00:00 grep --color=auto sshd
[root@hadoop100 ~]# kill 953
[root@hadoop100 ~]# ps -ef | grep sshd
root       3376      1  0 Nov14 ?        00:00:00 sshd: root@pts/0
root      14766   3610  0 03:40 pts/0    00:00:00 grep --color=auto sshd

kill953sshd守护进程后,当前的虚拟终端@pts/0并没有因为父进程的关闭而关闭,只不过父进程由原来的953改为了1,即系统初始化用户服务进程。然后重点是由于没有sshd,创建不了虚拟终端,远程现在连接不上服务器。

再次启动sshd也很简单,直接使用systemctl:

[root@hadoop100 ~]# systemctl start sshd
[root@hadoop100 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2022-11-15 03:46:44 PST; 3s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 14835 (sshd)
    Tasks: 1
   Memory: 1.0M
   CGroup: /system.slice/sshd.service
           └─14835 /usr/sbin/sshd -D

Nov 15 03:46:44 hadoop100 systemd[1]: Starting OpenSSH server daemon...
Nov 15 03:46:44 hadoop100 sshd[14835]: Server listening on 0.0.0.0 port 22.
Nov 15 03:46:44 hadoop100 sshd[14835]: Server listening on :: port 22.
Nov 15 03:46:44 hadoop100 systemd[1]: Started OpenSSH server daemon.
killall 杀死多个进程,支持通配符
远程登录的进程之间的启动顺序

首先系统启动会启动1号进程systemd用户初始化进程,然后由1号进程启动SSHD远程登录守护进程,再启动远程登录进程,再有远程登录进程启动bash作为shell的具体实现来产生各种子进程来执行各种远程命令。

我们在终端执行的各种命令都是基于bash产生的各种子进程

root        729      1  0 Nov14 ?        00:00:00 /bin/bash /usr/sbin/ksmtuned
root       3610   3376  0 Nov14 pts/0    00:00:00 -bash
hikaru     9494    981  0 01:44 tty1     00:00:00 -bash
root      14893   3610  0 03:52 pts/0    00:00:00 grep --color=auto bash

可以看到每个虚拟终端都对应着一个bash进程,而真实终端tty由于打开了终端也有一个bash

kill -9 强制杀死进程
pstree [options] 查看进程树
安装pstree
yum install pstree
pstree查看树形结构的运行进程
pstree | less
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─abrt-dbus───2*[{abrt-dbus}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─agetty
        ├─alsactl
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─chronyd
        ├─containerd───9*[{containerd}]
        ├─containerd-shim─┬─nginx───4*[nginx]
        │                 └─10*[{containerd-shim}]
        ├─containerd-shim─┬─redis-server───4*[{redis-server}]
        │                 └─10*[{containerd-shim}]
        ├─containerd-shim─┬─mysqld───26*[{mysqld}]
        │                 └─10*[{containerd-shim}]
        ├─crond
        ├─cupsd
        ├─dbus-daemon───{dbus-daemon}
        ├─dnsmasq───dnsmasq
        ├─dockerd─┬─2*[docker-proxy───5*[{docker-proxy}]]
        │         ├─3*[docker-proxy───7*[{docker-proxy}]]
        │         ├─docker-proxy───6*[{docker-proxy}]
        │         └─13*[{dockerd}]
        ├─gssproxy───5*[{gssproxy}]
        ├─irqbalance
        ├─ksmtuned───sleep
        ├─libvirtd───16*[{libvirtd}]
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───6*[{polkitd}]
        ├─rngd
        ├─rpcbind
        ├─rsyslogd───2*[{rsyslogd}]
        ├─smartd
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───2*[{vmtoolsd}]

如下面的

systemd-sshd-sshd-bash-pstree:1号进程首先启动后台sshd守护进程,然后远程登录的sshd进程被创建,然后基于此远程登录进程打开控制台界面即bash,执行命令pstree即为bash产生的子进程

选项说明
  • -p:显示进程的pid

    [root@hadoop100 ~]# pstree -p
    systemd(1)─┬─ModemManager(699)─┬─{ModemManager}(714)
               │                   └─{ModemManager}(732)
               ├─NetworkManager(701)─┬─{NetworkManager}(748)
               │                     └─{NetworkManager}(759)
               ├─VGAuthService(642)
               ├─abrt-watch-log(665)
               ├─abrt-watch-log(671)
               ├─abrtd(661)
               ├─agetty(1016)
               ├─alsactl(638)
               ├─atd(1018)
    
    
  • -u:显示当前用户

    [root@hadoop100 ~]# pstree -u
    systemd─┬─ModemManager───2*[{ModemManager}]
            ├─NetworkManager───2*[{NetworkManager}]
            ├─VGAuthService
            ├─2*[abrt-watch-log]
            ├─abrtd
            ├─agetty
            ├─alsactl
            ├─atd
            ├─auditd─┬─audispd─┬─sedispatch
            │        │         └─{audispd}
            │        └─{auditd}
            ├─avahi-daemon(avahi)───avahi-daemon
            ├─bluetoothd
            ├─chronyd(chrony)
    
    

    当子进程用户与父进程不同的时候才会显示,相同的话会进行隐藏

top [options] 实时监控进程
top - 22:09:07 up 19 min,  1 user,  load average: 0.00, 0.01, 0.04
Tasks: 160 total,   1 running, 159 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7990064 total,  6361228 free,   863720 used,   765116 buff/cache
KiB Swap:  3145724 total,  3145724 free,        0 used.  6864708 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                              
    48 root      39  19       0      0      0 S   0.7  0.0   0:00.76 khugepaged                                                                                                           
     9 root      20   0       0      0      0 S   0.3  0.0   0:00.91 rcu_sched                                                                                                            
    41 root      20   0       0      0      0 S   0.3  0.0   0:00.04 kworker/3:1                                                                                                          
   643 root      20   0  295376   5188   3948 S   0.3  0.1   0:01.24 vmtoolsd

up time:系统运行时间

load average:过去1、5、15分钟内系统的负载

tasks:当前执行的任务总数

PR:任务调度的优先级

NI:用户指定的Nice值(优先级)

VIRT:虚拟内存占用的大小

RES:物理内存

SHARE:共享内存

S:运行状态 (R:运行状态,S:睡眠状态)

选项说明
  • -d:指定top命令间隔几秒钟更新,默认为3秒

    [root@hadoop100 ~]# top -d 1
    Tasks: 160 total,   1 running, 159 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  7990064 total,  6359992 free,   864884 used,   765188 buff/cache
    KiB Swap:  3145724 total,  3145724 free,        0 used.  6863528 avail Mem 
    
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                              
      1906 polkitd   20   0 1311460 209776  10304 S   1.0  2.6   0:04.73 mysqld                                                                                                               
         1 root      20   0  193944   7092   4196 S   0.0  0.1   0:01.89 systemd                                                                                                              
         2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd                                                                                                             
         4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    
  • -i:使top不显示任何闲置或者僵死进程

    [root@hadoop100 ~]# top -i
    Tasks: 160 total,   1 running, 159 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 st
    KiB Mem :  7990064 total,  6360116 free,   864756 used,   765192 buff/cache
    KiB Swap:  3145724 total,  3145724 free,        0 used.  6863656 avail Mem 
    
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                              
       995 root      20   0 1108360  50064  19928 S   0.3  0.6   0:03.15 containerd                                                                                                           
      1906 polkitd   20   0 1311460 209776  10304 S   0.3  2.6   0:04.79 mysqld
    
  • -p:通过进程id仅仅监视某个进程

top命令筛选

进入top命令之后可以输入指令对进程进行筛选

  • u:对用户进行筛选,空格或者直接回车表示全部的用户

  • k:根据pid终止某一个进程,然后可以在输入一个发送信号(如之前的9)

    top - 22:51:04 up  1:01,  2 users,  load average: 0.00, 0.01, 0.05
    Tasks: 162 total,   2 running, 160 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  7990064 total,  6354900 free,   869772 used,   765392 buff/cache
    KiB Swap:  3145724 total,  3145724 free,        0 used.  6858568 avail Mem 
    PID to signal/kill [default pid = 63] 2752
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                              
      2752 hikaru    20   0  116464   3084   1624 S   0.0  0.0   0:00.01 bash                                                                                                                 
    
    
netstat 显示网络状态和端口占用信息
基本语法
选项说明
  • -a:显示所有正在监听(listen)和未监听的套接字(socket)

  • -n:拒接显示别名,能显示数字的全部转换为数字

  • -l:仅列出在监听的服务状态

  • -p:表示显示那个进程在调用

套接字标识两个进程之间的连接,向套接字写数据就相当于对端主机发送数据,从套接字读数据就相当于从端主机中读数据

套接字本质是一串数字,包含ip地址加端口号,用于标识连接的进程

常见的端口号(0~65535)

如SSH服务占用的是22端口、网页占用的是80端口、mysql为3306、redis6379

常用命令

netstat -anp | grep 进程号

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1796/docker-proxy   
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      2866/docker-proxy   
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      637/rpcbind         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1761/docker-proxy   
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1444/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      988/sshd            
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      983/cupsd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1301/master         
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      2171/sshd: root@pts 
tcp        0      0 192.168.60.100:22       192.168.60.1:60916      ESTABLISHED 2171/sshd: root@pts 
tcp6       0      0 :::3306                 :::*                    LISTEN      1809/docker-proxy

Proto:当前接口的网络协议

Recv-Q:连接到当前socket的用户程序还没有拷贝的字节数

Send-Q:已经发送但远程主机还没有收到的字节数(有可能丢掉或者重新传递的数据)

Address:0.0.0.0表示本地的所有地址。127.0.0.1本地回环地址(localhost)

netstat -nlp | grep 端口号

☆crontab [options] 系统定时任务
启动cron服务
[root@hadoop100 ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2022-11-15 21:50:03 PST; 1h 43min ago
 Main PID: 1015 (crond)
    Tasks: 1
   Memory: 768.0K
   CGroup: /system.slice/crond.service
           └─1015 /usr/sbin/crond -n

Nov 15 21:50:03 hadoop100 systemd[1]: Started Command Scheduler.
Nov 15 21:50:03 hadoop100 crond[1015]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 42% if used.)
Nov 15 21:50:03 hadoop100 crond[1015]: (CRON) INFO (running with inotify support)
选项说明
  • -e:编辑crontab定时任务

    [root@hadoop100 ~]# crontab -l
    no crontab for root
    
    
  • -l:查询crontab定时任务

  • -r:删除当前用户的所有crontab定时任务

crontab -e 编辑定时执行的内容
*/1 * * * * echo "hello,world" >> /root/hello

格式为 ****** + 执行的内容

第一个表示一个小时的第几分钟 0-59

第二个表示一天中的第几个小时 0-23

第三个表示一个月当中的第几天 1-31

第四个表示一年中的第几个月 1-12

最后一个表示星期几 0-7(0和7都表示星期天)

特殊符号的含义:

*:代表任何时间

,:代表不连续时间 如 0 8,9,10 代表8点整9点整、十点整

-:代表连续的时间范围 0 5 * * 1-6 表示在周一到周六的5点整执行

*/n:表示每隔多久执行一次

实例
posted @ 2022-12-03 09:56  Tod4  阅读(446)  评论(0编辑  收藏  举报