Shell与进程

摘要:
ps-A显示所有进程。psf用ASCII字符显示树状结构,表达程序间的相互关系。D不可中断,Uninterruptiblesleep;收到信号不唤醒和不可运行,进程必须等待直到有中断发生。T终止,Terminate;进程收到SIGSTOP,SIGSTP,SIGTIN,SIGTOU信号后停止运行运行。FLAGS与进程相关的数字标识创建进程准备知识我们所执行的任何程序,都是由父进程所产生出来的一个子进程,子进程在结束后,将返回到父进程去。

查看当前运行的进程

名称:       ps使用权限:    所有使用者
使用方式:    ps [options] [--help]
说明:       显示瞬间行程 (process) 的动态
参数:       ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义

常用参数

-A    显示所有进程(等价于-e)(utility)
-a    显示一个终端的所有进程,除了会话引线
-N    忽略选择。
-d    显示所有进程,但省略所有的会话引线(utility)
-x    显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p    pid 进程使用cpu的时间
-u    uid or username 选择有效的用户id或者是用户名
-g    gid or groupname 显示组的所有进程。
-m    显示所有的线程
-f    全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
-l    长格式(有F,wchan,C 等字段)
-j    作业格式
-o    用户自定义格式。
-w显示加宽可以显示较多的资讯
-H    显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
v     以虚拟存储器格式显示
s     以信号格式显示
U     username 显示该用户下的所有进程,且显示各个命令的详细路径。如:psU zhang;(utility)
e     命令之后显示环境(如:ps -d e; ps -a e)(utility)
h     不显示第一行

常用组合

psa    显示现行终端机下的所有程序,包括其他用户的程序。
ps -A   显示所有进程。
psc    列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
ps -e   此参数的效果和指定"A"参数相同。
pse    列出程序时,显示每个程序所使用的环境变量。
psf    用ASCII字符显示树状结构,表达程序间的相互关系。
ps -H   显示树状结构,表示程序间的相互关系。
ps -N   显示所有的程序,除了执行ps指令终端机下的程序之外。
pss    采用程序信号的格式显示程序状况。
psS    列出程序时,包括已中断的子程序资料。
ps -t<终端机编号>指定终端机编号,并列出属于该终端机的程序的状况。
psu    以用户为主的格式来显示程序状况。
psx    显示所有程序,不以终端机来区分。
最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。

head标头

USER    用户名
UID     用户ID(User ID)
PID     进程ID(Process ID)
PPID    父进程的进程ID(Parent Process id)
SID     会话ID(Session id%CPU    进程的cpu占用率
%MEM    进程的内存占用率
VSZ     进程所使用的虚存的大小(Virtual Size)
RSS     进程使用的驻留集大小或者是实际内存的大小,Kbytes字节。
TTY     与进程关联的终端(tty)
STAT    进程的状态:进程状态使用字符表示的(STAT的状态码)
    R    运行,Runnable (on run queue);正在运行或在运行队列中等待。
    S    睡眠,Sleeping;休眠中, 受阻, 在等待某个条件的形成或接受到信号。
    I    空闲,Idle
    Z    僵死,Zombie(a defunct process);进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
    D    不可中断,Uninterruptible sleep(ususally IO);收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
    T    终止,Terminate;进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
    P    等待交换页
    W    无驻留页,has no resident pages;没有足够的记忆体分页可分配。
    X    死掉的进程
    <高优先级进程
    N    低优先级进程
    L    内存锁页,Lock;有记忆体分页分配并缩在记忆体内
    s    进程的领导者(在它之下有子进程);
    l    多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
    +位于后台的进程组
STIME    进程启动时间和日期
TIME     进程使用的总cpu时间
COMMAND  正在执行的命令行命令
NI       优先级(Nice)
PRI      进程优先级编号(Priority)
WCHAN    进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。
FLAGS    与进程相关的数字标识

创建进程

准备知识

  • 我们所执行的任何程序,都是由父进程(parent process)所产生出来的一个子进程(child process),子进程在结束后,将返回到父进程去。此一现像在Linux系统中被称为 fork。当子进程被产生的时候,将会从父进程那里获得一定的资源分配、及(更重要的是)继承父进程的环境﹗
  • Shell变量大致可以分为3种类型:
  1. 内部变量:系统提供,不用定义,不能修改,比如$#,$?,$*,$0等
  2. 环境变量:系统提供,不用定义,可以修改,当前进程及其子进程中使用,比如PATH,PWD,SHELL等
  3. 用户变量(本地变量):用户定义,可以修改,在当前进程使用,比如var=123等
  4. 与其他语言的区别:非类型性质,也就是不必指定变量是数字或字符串等。
  • 关于环境变量:环境变量只能从父进程到子进程单向继承。换句话说:在子进程中的环境如何变更,均不会影响父进程的环境。
  • Shell脚本:其实就是将你平时在Shell prompt后所输入的多行command依序写入一个文件去而已

fork,source和exec方式执行Shell脚本

fork方式

也就是常用的方式,一般在shell直接输入脚本文件路径就可以了。这种方式由当前进程创建一个子进程,如下:

./mytest.sh
或者
bash
mytest.sh
source方式

使用方式如下(source与".”等价):

source ./mytest.sh或者
. ./mytest.shsource方式的特点是,在不另外创建子进程,而是在当前的的Shell环境中执行。
exec方式
exec ./mytest.sh
此方式的特点是,不另外创建子进程,但是会终止当前的shell执行(其实我觉得这样理解可能更准确:使用exec会在当前的进程空间创建一个子线程,然后终止当前线程的执行,到了新建的线程执行完之后,其实两个线程都终止了,也就是这个当前shell进程也就终止了)
测试一

创建test1.sh,内容如下:

#!/bin/shcd~/bin
pwd分别使用三种方式执行,source与exec方式都会将目录更改应用到当前环境,不同的是,exec方式执行完之后,shell环境就不能够使用了,会自动重启一个新的shell环境(进程)
测试二

一个更为详实的测试,脚本

脚本1.sh#!/bin/shA=B
echo"PID for 1.sh before exec/source/fork:$$"export A
echo"1.sh: /$A is $A"
case $1 inexec)
echo "using exec..."exec. /2.sh;;
source)
echo "using source...". ./2.sh;;
*)
echo "using fork by default..."./2.sh;;
esac
echo "PID for 1.sh after exec/source/fork:$$"
echo "1.sh: /$A is $A"
脚本2.sh#!/bin/sh
echo "PID for 2.sh: $$"
echo "2.sh get /$A=$A from 1.sh"A=C
export A
echo "2.sh: /$A is $A"

分别使用三种方式执行1.sh脚本,结果如下:

~$./1.shfork

PID for 1.sh before exec/source/fork:531
1.sh: $A is B
using fork by default...
PID for 2.sh:532
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:531
1.sh: $A is B
~$ ./1.shsource

PID for 1.sh before exec/source/fork:533
1.sh: $A is B
using source...
PID for 2.sh:533
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:533
1.sh: $A is C
~$ ./1.shexec

PID for 1.sh before exec/source/fork:537
1.sh: $A is B
using exec...
PID for 2.sh:537
2.sh get $A=B from 1.sh
2.sh: $A is C

注意:使用exec执行时1.sh中最后两句并没有被执行

终止进程之kill命令

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。

命令格式

kill [参数] [进程号]

命令功能

发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。如果任无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。

命令参数

-l  信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
-a  当处理当前进程时,不限制命令名和进程号的对应关系
-p  指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s  指定发送信号
-u  指定用户

注意:

  • kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:kill -2 123,它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。
  • kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。
  • 可以向多个进程发信号或终止它们。
  • 当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。
  • 应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。

示例

实例1:列出所有信号名称

[root@localhost test6]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

说明:
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。    下面是常用的信号:
HUP     1终端断线
INT     2    中断(同 Ctrl +C)
QUIT    3    退出(同 Ctrl +)
TERM    15终止
KIL     9强制终止
CONT    18   继续(与STOP相反, fg/bg命令)
STOP    19   暂停(同 Ctrl + Z)

实例2:得到指定信号的数值

[root@localhost test6]# kill -l KILL
9[root@localhost test6]# kill -l SIGKILL
9[root@localhost test6]# kill -l TERM
15[root@localhost test6]# kill -l SIGTERM
15

实例3:杀死指定用户所有进程

[root@localhost ~]# kill -9 $(ps -ef | greppeidalinux) 
[root@localhost ~]# kill -u peidalinux

注意:init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是init进程的子孙。init进程是不可杀的!

参考文档https://www.linux.org/threads/kill-signals-and-commands-revised.11625/

免责声明:文章转载自《Shell与进程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇分享24款非常有用的 jQuery 插件js把字符串(yyyymmdd)转换成日期格式(yyyy-mm-dd)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django项目:CMDB(服务器硬件资产自动采集系统)--11--07CMDB文件模式测试采集硬件数据

1 #settings.py 2 # ————————01CMDB获取服务器基本信息———————— 3 import os 4 5 BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))##当前路径 6 7 # 采集资产的方式,选项有:a...

使用shell从DB2数据库导出数据

使用shell脚本根据输入的用户名,数据库名,密码从DB2数据库导出数据 (1)a.sh脚本如下 #!/usr/bin/bash read -p "please input your DBNAME: " DBNAME read -p "please input your username: " username read -p "please inp...

adb -s指定安卓设备进行shell连接

1、adb shell如何指定安卓设备,下面是两个设备,第一个是模拟器,第二个是真机 2、使用命令adb -semulator-5554 shell adb -s <serial number> cmd 参考: 当有多个设备online时,命令行窗口通过adb连接指定设备方法_shell_Code Heaven-CSDN博客...

shell 下执行mysql 命令

在shell开发中,很多时候我们需要操作mysql数据库(比如:查询数据、导出数据等),但是我们又无法进入mysql命令行的环境,就需要在shell环境中模拟mysql的环境,使用mysql相关命令,本文总结几种shell操作mysql的方法,供大家参考。 方案1 mysql-uuser-ppasswd-e"insertLogTablevalues(......

shell脚本编程基础之while、for、until循环

while及until循环结构 while CONDITION;do statement done 进入循环:条件满足 退出循环:条件不满足 当需要命令的执行状态返回值时,可以直接把整个命令当做循环的条件 until CONDITION;do statement ... done 进入循环:条件不满足 退出循环:条件不满足 退出循环的...

如何在Shell脚本中逐行读取文件

在这里,我们学习Shell脚本中的3种方法来逐行读取文件。 方法一、使用输入重定向 逐行读取文件的最简单方法是在while循环中使用输入重定向。 为了演示,在此创建一个名为“ mycontent.txt”的文本文件,文件内容在下面: [root@localhost ~]# cat mycontent.txt This is a sample file W...