linux-shell-进程管理
探查进程–ps
report a snapshot of the current processes.
ps displays information about a selection of the active processes. If you want a repetitive update of the selection and the displayed information, use top(1) instead.
This version of ps accepts several kinds of options:
1 UNIX options, which may be grouped and must be preceded by a dash.
2 BSD options, which may be grouped and must not be used with a dash.
3 GNU long options, which are preceded by two dashes.
支持3种不同类型的命令行参数:
1.Unix风格的参数,前面加单破折号;
2.BSD风格的参数,前面不加破折号;
3.GNU风格的长参数,前面加双破折号;
参数
Unix风格的参数
-e 显示所有运行在系统上的进程
-f 扩展输出
-l 产生一个长格式输出
ps -ef | head -n 10
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2017 ? 00:04:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 2017 ? 00:00:00 [kthreadd]
root 3 2 0 2017 ? 00:01:11 [ksoftirqd/0]
root 5 2 0 2017 ? 00:00:00 [kworker/0:0H]
root 7 2 0 2017 ? 00:00:00 [migration/0]
root 8 2 0 2017 ? 00:00:00 [rcu_bh]
root 9 2 0 2017 ? 00:25:20 [rcu_sched]
root 10 2 0 2017 ? 00:00:00 [lru-add-drain]
-
UID:启动这些进程的用户
-
PID:进程ID
-
PPID:父进程ID
-
C:进程生命周期中的CPU利用率
-
STIME:进程启动时的系统时间
-
TTY:进程启动时的终端设备
-
TIME:运行进程需要的累计CPU时间
-
CMD:启动的查询名称
加-l 产生一个长格式输出
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 31398 ep_pol 2017 ? 00:04:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root 2 0 0 80 0 - 0 kthrea 2017 ? 00:00:00 [kthreadd]
-
F:内核分配给进程的系统标记
-
S:进程的状态(O:在运行;S:休眠;R:可运行,正在等待运行;Z:僵尸进程,进程已经结束但父进程已不存在;T:停止)
-
PRI:进程优先级(数字越大优先级越低)
-
NI:谦让度值,用来参与决定优先级
-
ADDR:进程的内存地址
-
SZ:假如进程被换出,所需交换空间的大致大小
-
WCHAN:进程休眠的内核函数地址
BSD风格的参数
Berkeley software distribution(BSD)
ps -aux | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 125592 3316 ? Ss 2017 4:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 2017 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2017 1:11 [ksoftirqd/0]
-
VSZ:进程在内存中的大小,以KB为单位
-
RSS:进程在未换出时占用的物理内存
-
STAT:当前进程状态的双字符状态码
第一个字符与Unix风格相同,第二个字符进一步说明进程的状态:
<:该进程运行在高优先级上;
N:该进程运行在低优先级上;
L:该进程有页面锁定在内存中
s:该进程是控制进程
l:该进程是多线程的
+:该进程运行在前台
GNU长参数
GNU在这个新改进过的ps命令中加入另外一些参数;
其中一些GNU长参数复制了现有的Unix或BSD类型的参数,而另一些则提供了新功能;
–forest 显示进程的层级信息
Usage Examples
1.To see every process on the system using standard syntax:
ps -e ps -ef ps -eF ps -ely
2.To see every process on the system using BSD syntax:
ps ax ps axu
3.To print a process tree:
–forest
ps -ejH ps axjf
4.To get info about threads:
ps -eLf ps axms
5.To get security info:
ps -eo euser,ruser,suser,fuser,f,comm,label ps axZ ps -eM
6.To see every process running as root (real & effective ID) in user format:
ps -U root -u root u
7.To see every process with a user-defined format:
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm ps -Ao pid,tt,user,fname,tmout,f,wchan
8.Print only the process IDs of syslogd:
ps -C syslogd -o pid=
9.Print only the name of PID 42:
ps -q 42 -o comm=
实时监测进程–top
top - display Linux processes
The top program provides a dynamic real-time view of a running system. It can display system summary information as well as a list of processes or threads currently being managed by the Linux kernel.
The types of system summary information shown and the types, order and size of information displayed for processes are all user configurable and that configuration can be made persistent across restarts.
The program provides a limited interactive interface for process manipulation as well as a much more extensive interface for personal configuration – encompassing every aspect of its operation.
And while top is referred to throughout this document, you are free to name the program anything you wish.
That new name, possibly an alias, will then be reflected on top’s display and used when reading and writing a configuration file.
输出信息
top - 18:05:01 up 346 days, 16:52, 5 users, load average: 0.00, 0.02, 0.05
Tasks: 114 total, 1 running, 113 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 0.3 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1014904 total, 83068 free, 440456 used, 491380 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 385960 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29973 root 10 -10 125884 9324 5708 S 1.0 0.9 898:30.23 xxxx
1 root 20 0 125592 3316 1888 S 0.0 0.3 4:04.92 systemd
-
PID:进程ID
-
USER:进程属主名字
-
PR:进程优先级
-
NI:进程谦让度值
-
VIRT:进程占用的虚拟内存总量
-
RES:进程占用的物理内存总量
-
SHR:进程和其他进程共享的内存总量
-
S:进程的状态(D:可中断的休眠状态;R:运行;S:休眠状态;T:跟踪状态或者停止状态;Z:僵化状态;)
-
%CPU:进程使用的CPU时间比例
-
%MEM:进程使用的内存占可用内存的比例
-
TIME+:自进程启动到目前为止的CPU时间总量
-
COMMAND:进程启动的程序名
help
top --help
top: inappropriate '-help'
Usage:
top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]
结束进程–kill
Linux进程信号
信号 | 名称 | 描述 |
---|---|---|
1 | HUP | 挂起 |
2 | INT | 中断 |
3 | QUIT | 结束运行 |
9 | KILL | 无条件终止 |
11 | SEGV | 段错误 |
15 | TERM | 尽可能终止 |
17 | STOP | 无条件停止运行,但不终止 |
18 | TSTP | 停止或暂停,但继续在后台运行 |
19 | CONT | 在STOP或者TSTP之后恢复执行 |
kill
kill命令会向命令行中列出的全部PID发送一个TERM信号;
TERM信号告诉进程可能的话就停止运行;
-s参数支持指定其他信号(用信号名或者信号值)
killall
通过进程名而不是PID来结束进程;killall命令也支持通配符;
killall http*
time命令
用法
- time(参数) time命令用于统计给定命令所花费的总时间
输出
输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。
- real时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
- user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
-
sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。
-
使用-o选项将执行时间写入到文件中:
/usr/bin/time -o outfile.txt ls
-
使用-a选项追加信息:
/usr/bin/time -a -o outfile.txt ls
- 使用-f选项格式化时间输出:
/usr/bin/time -f "time: %U" ls
-f选项后的参数:
参数. | 描述 |
---|---|
.%E | real时间,显示格式为[小时:]分钟:秒 |
%U | user时间。 %S sys时间。 |
%C | 进行计时的命令名称和命令行参数。 |
%D | 进程非共享数据区域,以KB为单位。 |
%x | 命令退出状态。 |
%k | 进程接收到的信号数量。 |
%w | 进程被交换出主存的次数。 |
%Z | 系统的页面大小,这是一个系统常量,不用系统中常量值也不同。 |
%P | 进程所获取的CPU时间百分百,这个值等于user+system时间除以总共的运行时间。 |
%K | 进程的平均总内存使用量(data+stack+text),单位是KB。 |
%w | 进程主动进行上下文切换的次数,例如等待I/O操作完成。 |
%c | 进程被迫进行上下文切换的次数(由于时间片到期)。 |
ntpdate
功能
当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间。
安装
yum install ntpdate
ntpdate简单用法
ntpdate ip
ntpdate 210.72.145.44
- 以下是一些可用的NTP服务器地址:
常用服务器地址: 服务器一: 1.cn.pool.ntp.org 服务器二: 2.asia.pool.ntp.org 服务器三: 3.asia.pool.ntp.org
Name . | IP | Location |
---|---|---|
210.72.145.44 | 210.72.145.44 | 中国(国家授时中心) |
sleep
语法
sleep(参数)
- 参数
时间:指定要暂停时间的长度。 时间长度,后面可接 s、m、h 或 d,其中 s 为秒,m 为 分钟,h 为小时,d 为日数。
实例–实现进度条
#!/bin/bash
b=''
for ((i=0;$i<=100;i++))
do
printf "Progress:[%-100s]%d%%\r" $b $i
sleep 0.1
b=#$b
done
echo
终端打印
echo
echo hello world
printf
printf "hello world"
#!/bin/bash
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
格式替代符
- %b 相对应的参数被视为含有要被处理的转义序列之字符串。
- %c ASCII字符。显示相对应参数的第一个字符
- %d, %i 十进制整数
- %e, %E, %f 浮点格式
- %g %e或%f转换,看哪一个较短,则删除结尾的零
- %G %E或%f转换,看哪一个较短,则删除结尾的零
- %o 不带正负号的八进制值
- %s 字符串
- %u 不带正负号的十进制值
- %x 不带正负号的十六进制值,使用a至f表示10至15
- %X 不带正负号的十六进制值,使用A至F表示10至15
- %% 字面意义的%
转义序列
- \a 警告字符,通常为ASCII的BEL字符
- \b 后退
- \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
- \f 换页(formfeed)
- \n 换行
- \r 回车(Carriage return)
- \t 水平制表符
- \v 垂直制表符
- \ 一个字面上的反斜杠字符
- \ddd 表示1到3位数八进制值的字符,仅在格式字符串中有效
- \0ddd 表示1到3位的八进制值字符
文字颜色
-
\e[1;31m 将颜色设置为红色
-
\e[0m 将颜色重新置回
echo -e "\e[1;31mThis is red text\e[0m"
This is red text
echo -e "\e[1;42mGreed Background\e[0m"
Greed Background
孤儿进程、僵尸进程与守护进程
僵尸进程
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。 这种进程称之为僵尸进程。
危害
unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到。 即在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。 直到父进程通过wait/waitpid来取时才释放。
但这样就导致了问题,如果进程不调用wait/waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程; 此即为僵尸进程的危害,应当避免。
任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。 这是每个子进程在结束时都要经过的阶段。 如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。 如果父进程能及时处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。 如果父进程在子进程结束之前退出,则子进程将由init接管。 init将会以父进程的身份对僵尸状态的子进程进行处理。
一个进程如果只复制fork子进程而不负责对子进程进行wait()或是waitpid()调用来释放其所占有资源的话,那么就会产生很多的僵死进程,如果要消灭系统中大量的僵死进程,只需要将其父进程杀死,此时所有的僵死进程就会编程孤儿进程,从而被init所收养,这样init就会释放所有的僵死进程所占有的资源,从而结束僵死进程。
孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。 孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。 由于孤儿进程会被init进程给收养,所以孤儿进程不会对系统造成危害。
守护进程
Linux Daemon(守护进程)是运行在后台的一种特殊进程。 它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。 Linux系统的大多数服务器就是通过守护进程实现的。 常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。
一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程; 守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。
refs
https://liubigbin.github.io/2016/03/11/Linux-%E4%B9%8B%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E3%80%81%E5%83%B5%E6%AD%BB%E8%BF%9B%E7%A8%8B%E4%B8%8E%E5%AD%A4%E5%84%BF%E8%BF%9B%E7%A8%8B/