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:表示每隔多久执行一次
实例
 
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号