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:表示每隔多久执行一次