优先级设置nice值 ; 给进程发送信号kill、nohup、setsid、 screen;查看网络状态netstat;proc文件系统

shell管理进程

一、优先级设置

可以在启动进程时⽤nice命令设置设置优先级

设置进程的nice值
# 设置进程的优先级
nice [-n <优先级>] [--help] [--version] [执⾏指令]
nice -n -11 bash test.sh

#选项介绍
若 nice命令未指定优先级的调整值,则以缺省值10来调整程序运⾏优先级,既在当前程序运⾏优先级基础之上增加10。
 -n <优先级> 指定设置优先级; 
	普通用户:(0~19)
	超级用户:(-20~19)
 --help 帮助信息;
 --version 版本信息;
 
# 执⾏范例:让命令以新的优先级执⾏
[root@localhost ~]# $ nice -n 5 ls # nice -n -20 命令
 
# ps -l 命令
其中的⼏个重要信息有:
UID : 代表执⾏者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍⽣⽽来的,亦即⽗进程的代号
PRI :代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏
NI :代表这个进程的nice值
PRI即进程的优先级,此值越⼩进程的优先级别越⾼。⽽NI,也就是我们所要说的nice值(通过nice
命令设置),其表示进程可被执⾏的优先级的修正数值。如前⾯所说,PRI值越⼩越快被执⾏,那么加
⼊nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。
所以,nice命令设置的优先级不是程序最终的优先级,⽽只是优先级的修正数值。
renice命令允许⽤户修改⼀个正在运⾏的进程的优先权。
	
# 对已运⾏的进程设置新的优先级
renice [设置优先级] pid
[root@localhost ~]# renice -20 11111

二、给进程发送信号

kill命令
[root@localhost ~]# kill -l # 列出所有⽀持的信号
=====================解释==========================
# HUP(1): 1、挂起信号 2、往往可以让进程重新加载配置
本信号在⽤户终端连接(正常或⾮正常)结束时发出, 通常是在终端的控制进程结束时, 通知同⼀session内的各个作业, 这时它们与控制终端不再关联。
登录Linux时,系统会分配给登录⽤户⼀个终端(Session)。在这个终端运⾏的所有程序,包括前台进程组和后台进程组,⼀般都 属于这个 Session。当⽤户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终⽌进程,因此前台进 程组和后台有终端输出的进程就会中⽌。不过,可以捕获这个信号,⽐如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。此外,对于与终端脱离关系的守护进程,这个信号⽤于通知它重新读取配置⽂件。
# INT(2): 中断, 通常因为按下ctrl+c⽽产⽣的信号,⽤于通知前台进程组终⽌进程。
# QUIT(3): 退出,和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产⽣core⽂件, 在这个意义上类似于⼀个程序错误信号。
# TSTP(20): 停⽌进⾏运⾏,通常因为按下ctrl+z⽽产⽣的信号
# KILL (9)⽤来⽴即结束程序的运⾏. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终⽌不了,可尝试发送这个信号。
# TERM(15):终⽌,是不带参数时kill默认发送的信号,默认是杀死进程,与SIGKILL不同的是该信号可以被阻塞和处理。通常⽤TERM信号来要求程序⾃⼰正常退出,如果进程终⽌不了,我们才会尝试SIGKILL。
# CONT(18) 被暂停的进程将继续恢复运⾏
# SIGSTOP(19) 暂停进程
# SIGCHLD⼦进程结束时, ⽗进程会收到这个信号。如果⽗进程没有处理这个信号,也没有等待(wait)⼦进程,⼦进程虽然终⽌,但是还会在内核进程表中占有表项,这时的⼦进程称为僵⼫ 进程。这种情 况我们应该避免(⽗进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派⽣的⼦进程,或者⽗进程先终⽌,这时⼦进程的终⽌⾃动由init进程来接管)。
# 参数
中断信号
	ctrl + c
	ctrl + z

	INT(2) : 
		kill -[信号名称|信号ID] pid
		
		kill -SIGINT  PID
		kill -INT     PID
		kill -2       PID 

退出信号:
	ctrl + d

暂停信号:将进程暂停
	SIGTSTP(20)
		kill -20 PID 
		kill -SIGTSTP PID 
		kill -TSTP PID

杀死进程信号
	SIGKILL
		kill -9 PID 
		kill -SIGKILL PID
		kill -KILL PID
注:不能够被捕捉

终止信号
	SIGTREM
		kill -15 PID 
		kill -SIGTERM PID
		kill -TERM PID

注:优雅终止进程

暂停和恢复信号
	SIGCONT : 恢复
	SIGSTOP :暂停

重载信号
	SIGHUP(1)
关于hup信号
我们知道,当⽤户注销(logout)或者⽹络断开或者终端关闭(注意注意注意,⼀定是终端整体关闭,不是单纯的exit)时,终端都会收到Linux HUP信号(hangup)信号,然后终端在结束前会关闭其所有⼦进程。
如果我们想让我们的进程在后台⼀直运⾏,不要因为⽤户注销(logout)或者⽹络断开或者终端关闭⽽⼀起被⼲掉,那么我们有两种解决⽅案
⽅案1:让进程忽略Linux HUP信号
⽅案2:让进程运⾏在新的会话⾥,从⽽成为不属于此终端的⼦进程,就不会在当前终端挂掉的情况下⼀起被带⾛。
nohup命令

针对⽅案1,我们可以使⽤nohup命令,nohup 的⽤途就是让提交的命令忽略 hangup 信号,该命令通 常与&符号⼀起使⽤

nohup 的使⽤是⼗分⽅便的,只需在要处理的命令前加上 nohup 即可,但是 nohup 命令会从终端解除进程的关联,进程会丢掉STDOUT,STDERR的链接。标准输出和标准错误缺省会被重定向到nohup.out ⽂件中。⼀般我们可在结尾加上"&"来将命令同时放⼊后台运⾏,也可⽤">filename2>&1"来更改缺省的重定向⽂件名。
nohup [执行的命令] &
后台启动,会在当前目录生成一个nohub.out文件,用于执行的命令的输出
要退出会话窗口最好先exit或者logout   或使用nohup
[root@localhost ~]# nohup ping www.baidu.con &>/dev/null &  #即使关闭终端2,子进程不会kill
setsid命令

针对⽅案1,我们还可以⽤setsid命令实现,原理与nohup是⼀样的,setid是直接将进程的⽗pid设置成1, 即让运⾏的进程归属于init的⼦进程,那么除⾮init结束,该⼦进程才会结束,当前进程所在的终端结束 后并不会影响进程的运⾏

1、在终端2中执⾏命令
[root@egon ~]# setsid ping www.baidu.com # 也可以在后⾯加&符号,丢后台运行 2、关闭终端2
3、在终端1中查看
[root@egon ~]# ps -ef |grep [p]ing
root 102335 1 0 17:53 ? 00:00:00 ping www.baidu.com
 setsid : 实际上开了一个孤儿进程
 
等价于[root@egon ~]# (ping www.baidu.com) #在子shell中提交任务
screen命令
# 1、安装
[root@egon ~]# yum install screen -y

# 2、运⾏命令
⽅式⼀:开启⼀个窗⼝并⽤-大S指定窗⼝名,也可以不指定
[root@egon ~]# screen -S egon_dsb

Screen将创建⼀个执⾏shell的全屏窗⼝。你可以执⾏任意shell程序,就像在ssh窗⼝中那样。
在该窗⼝中键⼊exit则退出该窗⼝,如果此时,这是该screen会话的唯⼀窗⼝,该screen会话退
出,否则screen⾃动切换到前⼀个窗⼝。

⽅式⼆:Screen命令后跟你要执⾏的程序
[root@egon ~]# screen vim test.txt
Screen创建⼀个执⾏vim test.txt的单窗⼝会话,退出vim将退出该窗⼝/会话。

# 3、原理分析
screen程序会帮我们管理运⾏的命令,退出screen,我们的命令还会继续运⾏,若关闭screen所在
的终端,则screen程序的ppid变为1,所以screen不会死掉,对应着它帮我们管理的命令也不会退
出测试略

# 4:重新连接会话
在终端1中运⾏
[root@egon ~]# screen
[root@egon ~]# n=1;while true;do echo $n;sleep 1;((n++));done
[root@egon ~]# 按下ctrl+a,然后再按下ctrl+d,注意要连贯,⼿别哆嗦,
[root@egon ~]# 此时可以关闭整个终端,我们的程序并不会结束
打开⼀个新的终端
[root@egon ~]# screen -ls
There is a screen on:
 109125.pts-0.egon (Detached) 1 Socket in /var/run/screen/S-root. [root@egon ~]# screen -r 109125 # 会继续运⾏
[root@egon ~]#
注意:如果我们刚开始已经⽤screen -S xxx指定了名字,那么我们其实可以直接
screen -r xxx ,就⽆须去找进程id了
远程演示
# 在终端1: [root@egon ~]# screen -S egon_av
# 开启⼀个新的终端,在该终端执⾏的命令,终端1会同步显示
[root@egon ~]# screen -x egon_av

三、查看网络状态

netstat
netstat主要用来查询系统端口相关问题

注:要使用netstat,需要安装yum install -y net-tools

# netstat常用参数
-t : 打印tcp链接的进程
-u : 打印UDP链接的进程
-l : 监听
-p : 打印进程的PID
-n : 不反解,不将ip地址解析成域名同时不将端口解析成对应的协议名称

netstat -nutlp
[root@tianyun ~]# netstat -tnlp # 查看正在监听的,且使⽤tcp协议的进程

[root@egon ~]# netstat -an |grep :22  #查看端口号
[root@egon ~]# netstat -an |grep :80
[root@egon ~]# lsof -i:22

四、proc文件系统

[root@localhost ~]# du -sh /proc

cpu:/proc/cpuinfo

[root@localhost ~]# grep "processor" /proc/cpuinfo # 逻辑cpu个数
processor : 0 [root@localhost ~]# grep "physical id" /proc/cpuinfo # 物理cpu个数
[root@localhost ~]# grep "cpu cores" /proc/cpuinfo # cpu核数
cpu cores : 1
 
[root@localhost ~]# cat /proc/cpuinfo
==flags
lm(64位)
vmx ⽀持虚拟化 Intel
svm ⽀持虚拟化 AMD
[root@localhost ~]# egrep --color 'lm|vmx|svm' /proc/cpuinfo
[root@localhost ~]# lscpu

内存:/proc/meminfo

# 查看内存
[root@egon ~]# less /proc/meminfo
[root@egon ~]# free -wm
[root@egon ~]# free -m
需要注意的是
free表示的是当前完全没有被程序使⽤的内存;
⽽cache在有需要时,是可以被释放出来以供其它进程使⽤的(当然,并不是所有cache都可以释
放,⽐如当前被⽤作ramfs的内存)。
⽽available才是真正表明系统⽬前可以提供给新启动的应⽤程序使⽤的内存。
/proc/meminfo从3.14内核版本开始提供MemAvailable的值;在2.6.27~3.14版本之间,是
free程序⾃⼰计算available的值;早于2.6.27版本,available的值则同free⼀样。
[root@egon ~]# man free # 看⼀眼写的清清楚楚

内核启动参数:/proc/cmdline

[root@localhost ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-1127.13.1.el7.x86_64 root=UUID=84b5cfa6-b0dc- 4d7a-a8fd-0302f0eb2f04 ro rhgb quiet LANG=zh_CN.UTF-8 
[root@localhost ~]# uptime
17:42:40 up 1 day, 1:33, 2 users, load average: 0.00, 0.01, 0.05
原文地址:https://www.cnblogs.com/caodan01/p/14597868.html