console.log('点个关注再走吧🍺');|

Tod4

园龄:2年11个月粉丝:21关注:0

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 @   Tod4  阅读(494)  评论(0编辑  收藏  举报
   
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起